繁体   English   中英

不兼容的类型:int[] 不能转换为 Comparable<Object> []

[英]Incompatible types: int[] cannot be converted to Comparable<Object>[]

我是泛型和铸造问题的新手。 我尝试对任何可比较的类型数组进行排序。 错误如标题; 代码如下:整数错误相同。 有什么问题,为什么?

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);
  }
}

你在这里有两个问题:

  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)

您的代码片段中有两个问题

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

void simple(Comparable<Object> input) {}

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

要为此创建一个实例,您可以实现如下类:

class MyComparable implements Comparable<Object> {}

您必须知道的是 genericType ( className ) 可确保您的类型安全。 这意味着:

  • Comparable<String>只能比较 String 对象
  • Comparable<Object>只能比较 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}; 是有效的陈述

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());
      }
}

泛型仅适用于 Object,不适用于原始类型。 幸运的是,您可以在包 java.lang 中找到一些有用的包装类,例如对象 Integer。 您的代码将变为:

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

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

尝试这个。 有用。 搜索谷歌了解更多详情。

    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]);
    }
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM