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());
}
}
我在相关问题中偶然发现了与这个人相同的问题: 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());
}
}