我使用整数对选择进行排序,并且可以正常工作,当我尝试修改程序以使用泛型时,编译器会抱怨并且我不知道如何解决它。如果有人能指出一些技巧和建设性的意见,我将不胜感激。这是代码。
public class SelelctionSort
{
public static void main(String[] args)
{
int[] list = {34, 17, 23, 35, 45, 9, 1};
System.out.println("Original Array: ");
printArray(list);
selectionSort(list);
System.out.println("\nSelection sort:");
printArray(list);
}
//selection sort
public static <E extends Comparable<E>> void selectionSort(E[] list)
{
for(int i=0; i<list.length -1; i++)
{
int iSmallest = i;
for(int j=i+1; j<list.length; j++)
{
if(list[iSmallest].compareTo((list[j])) > 0 )
{
iSmallest = j;
}
}
E iSwap = list[iSmallest];
list[iSmallest] = list[i];
list[i] = iSwap;
}
}
public static <E> void printArray(E[] list)
{
for(int i=0; i<list.length; i++)
{
System.out.print(list[i] + ", ");
}
}
}
以下是
javac
吐出的内容。SelelctionSort.java:7: error: method printArray in class SelelctionSort cannot be applied to given types;
printArray(list);
^
required: E[]
found: int[]
reason: inferred type does not conform to declared bound(s)
inferred: int
bound(s): Object
where E is a type-variable:
E extends Object declared in method <E>printArray(E[])
SelelctionSort.java:9: error: method selectionSort in class SelelctionSort cannot be applied to given types;
selectionSort(list);
^
required: E[]
found: int[]
reason: inferred type does not conform to declared bound(s)
inferred: int
bound(s): Comparable<int>
where E is a type-variable:
E extends Comparable<E> declared in method <E>selectionSort(E[])
SelelctionSort.java:11: error: method printArray in class SelelctionSort cannot be applied to given types;
printArray(list);
^
required: E[]
found: int[]
reason: inferred type does not conform to declared bound(s)
inferred: int
bound(s): Object
where E is a type-variable:
E extends Object declared in method <E>printArray(E[])
最佳答案
int[] list = {34, 17, 23, 35, 45, 9, 1};
...
selectionSort(list);
您正在尝试调用签名为
selectionSort()
的selectionSort(E[])
,但是int
不会扩展Comparable
(它是primitive,甚至不是对象),因此类型不匹配。您可以尝试创建一个
Integer[]
并将其传递。 Integer
是一个对象,它扩展了Comparable<Integer>
。另一种选择是重载
selectionSort()
以接受对象的通用类型并为每个所需的原语重载它。这是Java用于其Arrays.sort()
方法的解决方案。printArray()
也是一样