2014-10-31 83 views
4

我不知道最佳方式来表达我的问题,但我无法将ArrayList<class_that_implements_comparable>传递到与参数不同的类中的方法ArrayList<Comparable>将ArrayList <SomeClass>传递给参数ArrayList中的方法<Comparable>

比方说,我有一个司机二班的ArrayList:

ArrayList<Person> peopleList; 
ArrayList<Place> placeList; 

无论是类和广场类实现可比。

然后,在一类称为排序,我有两种方法:

public static void sort(ArrayList list){ 
    sortList(list); 
} 
public static void sortList(ArrayList<Comparable> list) 
{ 
    //Code here 
} 

有了这个设置,我可以打电话给Sorts.sort(peopleList)和Sorts.sort(placeList)没有任何问题。它完美的作品。

然而,如果我改变排序方法的签名有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<>直接到ArrayList<Comparable>

有没有一种方法,我可以直接转换它,而不必使用额外的方法?

非常感谢您的宝贵时间和您可以提供的任何见解!

回答

3

您需要传递实现Comparable本身或超类(或超类)的内容。

public static <T extends Comparable<? super T>> void sort(ArrayList<T> list) 

当你的方法有签名静态无效排序(ArrayList列表)它只接受ArrayList的实例。

如果Person实现Comparable,那么并不意味着List<Person>List<Comparable>的子类。所以,你需要一些额外的动作,提高你的方法:

  • 允许实现可比各类T extends Comparable
  • 允许超Comparable<? super T>
+0

谢谢后继承可比各类!这使得总体感觉和帮助非常大。 – 2014-10-31 06:35:38

+0

然后,这会要求我将>添加到ArrayList传递给其他任何方法。有没有办法去除这个要求? – 2014-10-31 06:40:17

+0

取决于你的方法。如果他们与你的'sort'方法有相同的想法(接受所有可比对象的列表),那么你应该。 – 2014-10-31 06:47:38

相关问题