【问题标题】:Interfaces, Parameterized Types and Collections接口、参数化类型和集合
【发布时间】:2015-12-07 09:27:53
【问题描述】:

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

  1. 我有 3 个类:Dog、Cat、Mouse

  2. 每个都有自己的 ArrayList 例如,ArrayList dogs = new ArrayList();

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

  4. 我有一个方法叫做 changeFurColor(ArrayList list)。

  5. 此外,changeFurColor() 使用实现 的比较器对输入 ArrayList 进行排序,因此我的 changeFurColor() 方法中需要此参数化类型。

  6. 我用 changeFurColor(dogs); 调用方法

但是,这不会编译。 类型与 类型不匹配,即使前者实现了后者。

我知道我可以简单地使用 ?作为 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(dogs) 无法编译

【问题讨论】:

  • 您可以在问题中使用反引号 ` 将代码 sn-ps 括起来。您将能够更轻松地呈现&lt;brackets&gt;
  • 正如@SotiriosDelimanolis 所说,发布您的代码。给你写的会更少,我们更容易回答
  • 问题与泛型和类型擦除有关:docs.oracle.com/javase/tutorial/java/generics/erasure.html
  • 泛型不是协变的; List&lt;Dog&gt; 不是 List&lt;AnimalInterface&gt;,即使 DogListInterface
  • public static &lt;T extends AnimalInterface&gt; void changeFurColor(ArrayList&lt;T&gt; list)

标签: java generics collections


【解决方案1】:

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

感谢 Solitirios 对这个问题的评论。

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

【讨论】:

    【解决方案2】:

    我在设计中没有发现任何问题。我需要确切的代码来判断到底出了什么问题,但可能的错误是:

    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 方法中的实例:

      Collections.sort(list, MyAnimalFurComparator);
      

      你需要把它改成这样:

      Collections.sort(list,new MyAnimalFurComparator());
      
    3. MyAnimalFurComparator 的 compare 方法也应该返回一个 int

    【讨论】:

    • 谢谢,这是伪代码。实际的代码在几个不同的类中,所以它会很复杂和令人困惑。 =
    猜你喜欢
    • 2013-04-08
    • 2013-05-13
    • 2018-09-15
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多