java - 如何在Java中将通用列表转换为通用数组?

标签 java arrays generics

我尝试编写一个泛型类来对任何类型的数组进行排序。
第一个排序函数对任何类型的数组进行排序。 它工作正常。

在第二个排序函数中,我传递了列表并尝试转换为数组以使用第一个排序函数。 但是当我尝试在泛型类中将列表转换为数组时,它会抛出意外的类型错误。

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

    public class Sort<T extends Comparable>{
         //public T l;
         T tmp;
        public  void sort(T[] l){

        for(int i=0;i<l.length;i++){
           for(int j=i+1;j<l.length;j++){
              if(l[i].compareTo(l[j])>0){
                   tmp=l[i];
                  l[i]=l[j];
                   l[j]=tmp;
              }
            }
        }
                    System.out.println( Arrays.asList(l));
              }
         public  <T extends Comparable>  void sort(List<T> l){
          T[] array = (T[]) new Object[l.size()];
          sort(l.toArray(T[] array));
      // System.out.println(l);
         }   

    public static void main(String[] args){
                Integer[] i={2,4,1,5,3};
                List<String> l = Arrays.asList("c","d","a","e","b");
                Sort s=new Sort();
                //String[] j=l.toArray(new String[l.size()]);
                s.sort(i);
                s.sort(l);

            }
    }

最佳答案

正如 n247s 所建议的,如果您希望类和方法之间保持一致性,则应该对它们使用相同的参数化类型。
它提出了另一个问题:如果你这样做,你不应该混合橙子和香蕉,因为否则你的排序可能会产生意想不到的结果。假设您在数组或列表中放入了 Comparable 对象的组合,这些对象的设计目的不是为了在它们之间进行比较:StringBooleanCustomClassWhichIsComparable

此外,在将列表转换为数组的方法中,您希望在 Comparable 数组中分配一个 Object 数组。但您不能这样做,因为所有 Object 实例不一定都是 Comparable 实例。

 public  <T extends Comparable>  void sort(List<T> l){
   T[] array = (T[]) new Object[l.size()];
   sort(l.toArray(T[] array));
 }  


你可以做到:

public void sort(List<T> l) {
  T[] array = (T[]) new Comparable[l.size()];
  sort(l.toArray(array));
}

在这两种情况下,您都会收到警告,但也不异常(exception)。

这里是建议修改的类:

public class Sort<T extends Comparable<T>> {

    T tmp;


    public void sort(T[] l) {

    for (int i = 0; i < l.length; i++) {
        for (int j = i + 1; j < l.length; j++) {
          if (l[i].compareTo(l[j]) > 0) {
            tmp = l[i];
            l[i] = l[j];
            l[j] = tmp;
          }
        }
    }
      System.out.println(Arrays.asList(l));
    }

    public void sort(List<T> l) {
       T[] array = (T[]) new Comparable[l.size()];
       sort(l.toArray(array));
     }

    public static void main(String[] args) {
      Integer[] i = { 2, 4, 1, 5, 3 };
      Sort<Integer> sortInt = new Sort<Integer>();
      sortInt.sort(i);

      Sort<String> sortString = new Sort<String>();
      List<String> l = Arrays.asList("c", "d", "a", "e", "b");
      sortString.sort(l);
    }
}

关于java - 如何在Java中将通用列表转换为通用数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40956596/

相关文章:

f# - F# 中的泛型和接口(interface)

c# - 将对象列表转换为元组列表而不进行迭代

java - 如何添加而不重复?

java - Spring Batch 与 HazelCast 集成

java - 如何成功升级位图?

javascript - 在 Javascript 中合并和排序两个对象数组

ruby - 创建数组数组的优雅方式?

java - 如何在 GWT Java 中获取当前工作目录

c# - System.Array 是否对值类型执行装箱?

Java Generics - 类本身的子类?