我不知道用来表达我的问题的最佳方式,但我在将ArrayList<class_that_implements_comparable>
传递给另一个类中的方法作为参数ArrayList<Comparable>
时遇到了问题。< / p>
假设我在驱动程序类中有两个ArrayLists:
ArrayList<Person> peopleList;
ArrayList<Place> placeList;
Person 类和 Place 类都实现了Comparable。
然后,在一个名为Sorts的类中,我有两个方法:
public static void sort(ArrayList list){
sortList(list);
}
public static void sortList(ArrayList<Comparable> list)
{
//Code here
}
通过此设置,我可以毫无问题地调用Sorts.sort(peopleList)和Sorts.sort(placeList)。它运作得很好。
但是,如果我将sort方法的签名更改为ArrayList<Comparable>
的参数...
public static void sort(ArrayList<Comparable> list){
sortList(list);
}
我的驱动程序类中出现以下错误:
Error:(59, 14) java: method sort in class Sorts cannot be applied to given types;
required: java.util.ArrayList<java.lang.Comparable>
found: java.util.ArrayList<Passenger>
reason: actual argument java.util.ArrayList<Passenger> cannot be converted to java.util.ArrayList<java.lang.Comparable> by method invocation conversion
为什么java允许我使用非通用ArrayList<>
参数将通用ArrayList
传递给另一个类,然后使用ArrayList
将ArrayList<Comparable>
传递给另一个方法争论,但它不允许我将通用ArrayList<>
直接传递给ArrayList<Comparable>
?
有没有办法可以直接转换它而不必使用额外的方法?
非常感谢你的时间和你能提供的任何见解!
答案 0 :(得分:3)
您需要传递实现Comparable本身或超类(或超类)的东西。
public static <T extends Comparable<? super T>> void sort(ArrayList<T> list)
当您的方法具有签名静态void排序(ArrayList list)时,它只接受ArrayList的实例。
如果Person实现Comparable,则并不意味着List<Person>
是List<Comparable>
的子类。所以你需要一些额外的动作来改进你的方法:
T extends Comparable
Comparable<? super T>