不兼容的类型:int []无法转换为Comparable <object> [] </object>

时间:2014-10-22 21:41:41

标签: java generics comparable

我对仿制药和铸造问题不熟悉。我尝试排序任何类似的类型数组。错误是标题;代码如下:整数的错误相同。问题是什么?为什么?

class Sort{
  public static void selectionSort(Comparable<Object>[] input)
  {/* selection Sort Alg*/}
  public static void main((String[] args){
    int[] intArray = {2,3,5,1};
    Sort.selectionSort(intArray);
  }
}

5 个答案:

答案 0 :(得分:4)

这里有两个问题:

  1. int是POD,不是对象。从int[]到相应的Integer[]的装箱和拆箱不会自动执行。您需要将intArray声明为:

    Integer[] intArray = {2,3,5,1};
    
  2. Integer实施Comparable<Integer>,而非Comparable<Object>。这两个专业是不同的和不兼容的类型。声明selectionSort的正确方法是使用泛型,正如您在标题中所建议的那样:

    public static <T extends Comparable<T>> void selectionSort(T[] input)
    

答案 1 :(得分:1)

您的代码段中有两个问题

第一个是您的方法的参数,让我们看一下这个例子

void simple(Comparable<Object> input) {}

这个简单的方法需要一个Comparable<Object>的实例。

要为其创建实例,您可以实现类:

class MyComparable implements Comparable<Object> {}

您必须意识到的是genericType(className),确保您的类型安全。这意味着:

  • Comparable<String>只能比较String对象
  • Comparable<Object>只能比较对象

在泛型参数方面,你不能真正在类层次结构上。

班级Integer实施Comparable<Integer>所以为了能够使用它,你可以这样做:

void simple(Comparable<Integer> input) {}

您将能够传递实现Comparable<Integer>的所有内容。

对于数组是相同的规则,

void array(Comparable<Integer>[] input) {}

但您应该记住的是int[]Integer[]不同JVM对这些类型使用不同的操作。

int[]存储原始整数值。 Integer[]存储对Integer类的引用。

  • Comparable<Integer>[] array = {1,2,3,4};不允许
  • Comparable<Integer>[] array = new Integer[] {1,2,3,4};是有效声明

答案 2 :(得分:0)

int是一个原语,你应该使用Integer。你有一个已经排序的方法来排序整数:

class Sort{
  public static void main(String[] args){
        List<Integer> intList = new ArrayList<Integer>();
        intList.add(2);
        intList.add(3);
        intList.add(5);
        intList.add(1);
        Collections.sort(intList);
        System.out.println(intList.toString());
      }
}

答案 3 :(得分:0)

泛型仅适用于Object,而不适用于基本类型。幸运的是,您可以在java.lang包中找到一些有用的包装类,就像对象Integer一样。 您的代码将变为:

Integer[] intArray = new Integer[]{2,3,5,1};
Sort.selectionSort(intArray);

我建议将参数更改为selectionSort:您不需要Comparable<Object>,而是通用T<extends Comparable<? super T>>;换句话说,你需要一个扩展一个类的参数,它可以比较T和他们的超类

答案 4 :(得分:0)

尝试一下。有用。在Google中搜索更多详细信息。

    public class Test{
    public static void main(String[] args) {
        String[] arr1 ={"a","b","c"};
        Float[] arr2 ={1.1f, 1.2f, 1.3f};
        Integer[] arr3 = {1,2,3};
        Object[][] arr = {arr1,arr2,arr3};
        System.out.println(arr[1][1]);
    }
   }