List of Dogs List of animals... 解决办法是什么?

List of Dogs List of animals... What is the solution?

我在相关问题中偶然发现了与这个人相同的问题: Is List<Dog> a subclass of List<Animal>? Why are Java generics not implicitly polymorphic?

尽管我确实理解为什么无法将 List<Dog> 传递给接受 List<Animal> 的方法,如答案中所述;我想知道最终的解决方案是什么?假设我想让方法打印列表中对象的名称,比如

public void printNames(List<Animal> list){
   for(Animal a : list){
      System.out.println(a.getName());
   }
}

鉴于 Animal 实现了 getName(),此方法可以安全地调用任何动物列表或该 class 的子类型。既然我做不到,那么为我可能拥有的任何(亚)动物列表提供此功能的最佳方式是什么?

我可以说什么行不通,这是显而易见的方式:

public void printNames(List<Dog> list){
   for(Dog d : list){
      System.out.println(d.getName());
   }
}

因为抛出 nameClash:两种方法具有相同的擦除

I wonder what is ultimately the solution?

一个通配符:

public void printNames(List<? extends Animal> list){

或者,如果你需要做一些事情,比如把你从中取出的东西放入 list,一个类型变量:

public <A extends Animal> void printNames(List<A> list){

这取决于您打算如何处理结果。研究"PECS" 会有帮助。这种情况可以使用通配符来解决,但也可能涉及到泛型等技术。

public void printNames(List<? extends Animal> list){
   for(Animal a : list){
      System.out.println(a.getName());
   }
}

您也可以只使用 toString() 方法,这可能会更好。

public void printAnything(List<?> list){
   for(Object a : list){
      System.out.println(a.toString());
   }
}