【发布时间】:2015-12-07 09:27:53
【问题描述】:
这可能是一个 java 101 问题。但是我已经离开 Java 十年了,所以这对我来说是新的。
我有 3 个类:Dog、Cat、Mouse
每个都有自己的 ArrayList 例如,ArrayList
dogs = new ArrayList (); Dog Cat 和 Mouse 实现 AnimalInterface(具有 getFurColor() 和 setFurColor(Color c) 等方法)。
我有一个方法叫做 changeFurColor(ArrayList
list)。 此外,changeFurColor() 使用实现
的比较器对输入 ArrayList 进行排序,因此我的 changeFurColor() 方法中需要此参数化类型。 我用 changeFurColor(dogs); 调用方法
但是,这不会编译。
我知道我可以简单地使用 ?作为 changeFurColor 参数的类型,然后在方法中强制转换或执行实例作为检查,但是我无法使用我的比较器对列表进行排序(并且拥有 3 个不同的比较器似乎很愚蠢)。
我不能用
我确信有一个简单的解决方案,但我的书都没有提供它,我在网上找不到它
伪代码:
public interface AnimalInterface
{
public Color getColor();
......
}
public class Dog implements AnimalInterface
{
}
public class Cat implements AnimalInterface
{
}
public void example()
{
ArrayList<Dog> dogs = new ArrayList<Dog>();
ArrayList<Cat> cats = new ArrayList<Cat>();
ArrayList<Mouse> mice = new ArrayList<Mouse>();
changeFurColor(dogs)
}
public void changeFurColor(ArrayList <AnimalInterface> list)
{
... ..
Collections.sort(list, MyAnimalFurComparator);
}
public class MyAnimalFurComparator implements Comparator<AnimalInterface>
{
@Override
public int compare(AnimalInterface o1, AnimalInterface o2)
{
...
}
}
更新 changeFurColor(dogs) 无法编译
【问题讨论】:
-
您可以在问题中使用反引号
`将代码 sn-ps 括起来。您将能够更轻松地呈现<brackets>。 -
正如@SotiriosDelimanolis 所说,发布您的代码。给你写的会更少,我们更容易回答
-
泛型不是协变的;
List<Dog>不是List<AnimalInterface>,即使Dog是ListInterface。 -
public static <T extends AnimalInterface> void changeFurColor(ArrayList<T> list)
标签: java generics collections