将ArrayList <someclass>传递给单独的类中的方法作为参数ArrayList <comparative> </comparative> </someclass>

时间:2014-10-31 06:17:02

标签: java generics arraylist

我不知道用来表达我的问题的最佳方式,但我在将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传递给另一个类,然后使用ArrayListArrayList<Comparable>传递给另一个方法争论,但它不允许我将通用ArrayList<>直接传递给ArrayList<Comparable>

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

非常感谢你的时间和你能提供的任何见解!

1 个答案:

答案 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>
  • 之后继承Comparable的所有类型