Java 不兼容类型:int[]无法转换为可比较的<;对象>;[]

Java 不兼容类型:int[]无法转换为可比较的<;对象>;[],java,generics,comparable,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};

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

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);
  }
}
类排序{
公共静态无效选择排序(可比[]输入)
{/*选择排序Alg*/}
公共静态void main((字符串[]args){
int[]intArray={2,3,5,1};
排序。选择排序(intArray);
}
}

int是一个原语,您应该使用Integer。您已经有了一个对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());
      }
}
类排序{
公共静态void main(字符串[]args){
List intList=new ArrayList();
增加(2);
增加(3);
增加(5);
增加(1);
Collections.sort(intList);
System.out.println(intList.toString());
}
}

这里有两个问题:

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

    Integer[] intArray = {2,3,5,1};
    
  • Integer
    实现了
    compariable
    ,而不是
    compariable
    。这两种专门化是不同的不兼容类型。声明
    selectionSort
    的正确方法是使用泛型,正如您在标题中所建议的:

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

  • 泛型只适用于对象,而不适用于基本类型。幸运的是,您可以在包java.lang中找到一些有用的包装类,如对象整数。 您的代码将成为:

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

    我建议将参数更改为selectionSort:您不想要一个可比较的
    ,而是一个通用的
    t您的代码片段中有两个问题

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

    void简单(可比较输入){}

    这个简单的方法需要一个可比较的
    实例

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

    类MyComparable实现了可比较的{}

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

    • Comparable
      只能比较字符串对象
    • Comparable
      只能比较对象
    就泛型参数而言,您不能真正依赖于类层次结构

    Integer
    实现了
    compariable
    ,因此可以使用它来执行以下操作:

    void简单(可比较输入){}

    您将能够传递所有实现的
    Comparable

    使用数组也是同样的规则

    void数组(可比较的[]输入){}

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

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

    • Comparable[]数组={1,2,3,4};
      不允许
    • Comparable[]数组=新整数[]{1,2,3,4};
      是有效语句

    试试这个。它很有效。在谷歌搜索更多详细信息

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

    尝试直接使用:Collections.sort(intArray);如果您认为这将有助于
    Peterxwl
    more,请编辑您的答案。您的工作正常,但compareTo方法中出现错误:private static boolean less(Comparable a,Comparable b){返回a.compareTo(b)<0;}显示错误为“Comparable与T不兼容”.怎么解决?很有效!你能解释一下你的两个答案之间的区别吗?@Peterxwl,静态布尔值less@Peterxwl在第一种情况下,数组中的每个元素都是一个
    可比的
    ,在第二种情况下,每个元素都是
    T
    类型,这是
    可比的
    的子类rt
    实现时,很难说它在哪里坏了,但可能您试图将
    输入的元素
    (静态类型
    可比
    )分配给静态类型为
    T
    的变量,如果没有向下转换,这是不可能的。