【问题标题】:Passing an ArrayList<SomeClass> to a method in a separate class as argument ArrayList<Comparable>将 ArrayList<SomeClass> 作为参数传递给单独类中的方法 ArrayList<Comparable>
【发布时间】:2014-12-27 09:55:15
【问题描述】:

我不知道表达我的问题的最佳方式,但我无法将 ArrayList&lt;class_that_implements_comparable&gt; 作为参数 ArrayList&lt;Comparable&gt; 传递给不同类中的方法。

假设我在一个驱动程序类中有两个 ArrayList:

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)。效果很好。

但是,如果我将排序方法的签名更改为具有ArrayList&lt;Comparable&gt; 的参数...

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&lt;&gt; 传递给另一个类,然后使用 ArrayList&lt;Comparable&gt; 参数将 ArrayList 传递给另一个方法,但它不会让我将通用的ArrayList&lt;&gt; 直接传递给ArrayList&lt;Comparable&gt;

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

非常感谢您抽出宝贵的时间以及您能提供的任何见解!

【问题讨论】:

    标签: java generics arraylist


    【解决方案1】:

    您需要传递实现 Comparable 本身或在超类(或超类)中的东西。

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

    当您的方法具有签名 static void sort(ArrayList list) 时,它只接受 ArrayList 的实例。

    如果Person实现了Comparable,并不意味着List&lt;Person&gt;List&lt;Comparable&gt;的子类。所以你需要一些额外的动作来改进你的方法:

    • 允许所有实现 Comparable T extends Comparable 的类型
    • 允许在超类Comparable&lt;? super T&gt;之后继承Comparable的所有类型

    【讨论】:

    • 谢谢!这完全有道理,而且帮助很大。
    • 这确实需要我添加 > 到 ArrayList 传递给的任何其他方法。有没有办法取消这个要求?
    • 取决于你的方法。如果他们的想法与您的 sort 方法相同(接受所有可比较对象列表),是的,您应该这样做。
    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2018-05-29
    相关资源
    最近更新 更多