java接口、参数化类型和集合
这可能是一个Java101问题。但是我已经离开java十年了,所以对我来说它是新的
我有三门课:狗、猫、老鼠
每个都有自己的ArrayList e、 g.,ArrayList<;狗>;dogs=新ArrayList<;狗>;();
Dog Cat and Mouse实现AnimalInterface(有getFurColor()和setFurColor(Color c)等方法)
我有一个叫做changeFurColor(ArrayList<;AnimalInterface>;list)的方法
此外,changeFurColor()使用实现<;动物界面>;所以我需要在changeFurColor()方法中使用这个参数化类型
我用changeFurColor(狗)调用该方法
然而,这不会编译。类型<;狗>;与类型不匹配<;动物界面>;尽管前者实现了后者
我知道我可以简单地使用?作为changeFurColor参数的类型,然后在方法中强制转换或执行实例作为检查,但是我不能用我的比较器对列表进行排序(使用3个不同的比较器似乎很愚蠢)
我无法使用<;键入所有ArrayList;动物界面>;因为我不想让狗和猫冒险
我确信有一个简单的解决方案,但我的书都没有提供,而且我在网上也找不到
伪代码:
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(狗)不编译
# 1 楼答案
我看不出设计中有任何问题。我需要准确的代码来判断到底哪里出了问题,但可能的错误是:
您没有在动物类(Dog、Cat..)中实现AnimalInterface方法,该方法需要显式实现:
您正在传递一个Comparator类,而不是集合中的实例。排序方法:
您需要将其更改为:
此外,MyAnimalFurComparator的比较方法应返回一个int
# 2 楼答案
这是正确的答案(对于跟随我的新手来说)
Solitirios对这个问题的评论值得赞扬