Java 铸造ArrayList<;可比>;转换为不同的ArrayList类型
我有一个排序方法,它接受一个ArrayList,使用compateTo()方法对它进行排序,然后返回一个排序后的ArrayList。这是:Java 铸造ArrayList<;可比>;转换为不同的ArrayList类型,java,sorting,casting,arraylist,Java,Sorting,Casting,Arraylist,我有一个排序方法,它接受一个ArrayList,使用compateTo()方法对它进行排序,然后返回一个排序后的ArrayList。这是: publicstaticarraylistinsertionsort(ArrayList 输入){ 可比温度; 阵列列表结果; 结果=(ArrayList)input.clone(); 如果(result.size()>1){ for(int k=1;k
publicstaticarraylistinsertionsort(ArrayList
输入){
可比温度;
阵列列表结果;
结果=(ArrayList)input.clone();
如果(result.size()>1){
for(int k=1;k
在我的程序的其他地方,我定义了实现可比较接口的DVD对象,创建了一组对象,并将它们存储在名为members的ArrayList中。现在,当我尝试像这样对成员进行排序时:
members=(ArrayList)YaSort.insertionSort(members);
我得到以下错误:线程“main”java.lang.ClassCastException中的异常:[Ljava.lang.Comparable;无法转换为[LDVD
我如何解决这个问题?
谢谢您的时间。您需要将
成员定义为ArrayList
,因为即使是DVD实现/扩展了CompariableArrayList
也没有实现/扩展ArrayList
——这称为协方差/逆变,Java不支持。
(实际上在C#中支持它)似乎您希望对实现可比的对象列表进行排序,并返回相同对象的列表,而不仅仅是可比的。在这种情况下,您可以使用编译器可以使用的方法参数来确定返回结果的类型:
public static <T extends Comparable<? super T>> ArrayList<T>
insertionSort(ArrayList<T> input) {
....
}
泛型的要点是您不需要强制转换任何引用类型。此外,混合泛型和原始类型的稀有类型是不好的。按照惯例,List
通常比ArrayList
更受欢迎
方法的开头应该类似于:
public static <T extends Comparable<? super T>> List<T> insertionSort(
List<T> input
) {
List<T> result = new ArrayList<T>(input);
public static我认为应该是java.util.Comparable
(我的意思是java.lang.Comparable
。它是java.util.Comparator
。显然。但它是泛型类型,不应该原始使用。)“而且,混合泛型和原始类型的罕见类型是不好的。”这意味着什么?@ŞükrüHasdemir InArrayList
您使用的是泛型,但Comparable
是泛型类型,但缺少泛型参数。混合泛型和原始类型的后果很微妙。为什么我在这里投了反对票?
public static <T extends Comparable<? super T>> List<T> insertionSort(
List<T> input
) {
List<T> result = new ArrayList<T>(input);