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
的变量,如果没有向下转换,这是不可能的。