有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java接口、参数化类型和集合

这可能是一个Java101问题。但是我已经离开java十年了,所以对我来说它是新的

  1. 我有三门课:狗、猫、老鼠

  2. 每个都有自己的ArrayList e、 g.,ArrayList<;狗>;dogs=新ArrayList<;狗>;();

  3. Dog Cat and Mouse实现AnimalInterface(有getFurColor()和setFurColor(Color c)等方法)

  4. 我有一个叫做changeFurColor(ArrayList<;AnimalInterface>;list)的方法

  5. 此外,changeFurColor()使用实现<;动物界面>;所以我需要在changeFurColor()方法中使用这个参数化类型

  6. 我用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(狗)不编译


共 (2) 个答案

  1. # 1 楼答案

    我看不出设计中有任何问题。我需要准确的代码来判断到底哪里出了问题,但可能的错误是:

    1. 您没有在动物类(Dog、Cat..)中实现AnimalInterface方法,该方法需要显式实现:

      class Dog implements AnimalInterface{public Color getColor(){return new Color();}}
      
      class Cat implements AnimalInterface{public Color getColor(){return new Color();}}
      
    2. 您正在传递一个Comparator类,而不是集合中的实例。排序方法:

      Collections.sort(list, MyAnimalFurComparator);
      

      您需要将其更改为:

      Collections.sort(list,new MyAnimalFurComparator());
      
    3. 此外,MyAnimalFurComparator的比较方法应返回一个int

  2. # 2 楼答案

    这是正确的答案(对于跟随我的新手来说)

    Solitirios对这个问题的评论值得赞扬

    public static <T extends AnimalInterface> void changeFurColor(ArrayList<T> list) –