我在相關問題中偶然發現了和這個人一樣的問題。 List<Dog> 是List<Animal>的子類嗎?為什么Java泛型不是隱式多型的?
雖然我確實理解為什么不能將一個List<Dog>傳遞給一個接受List<Animal>的方法,正如答案中解釋的那樣;我想知道最終的解決方案是什么?假設我想讓這個方法列印串列中的物件的名字,就像
public void printNames(List< Animal> list){
for(動物 a : list){
System.out.println(a.getName())。
}
}
鑒于Animal實作了getName(),這個方法在呼叫任何動物串列或該類的子型別時都是安全的。既然我不能這樣做,那么為我可能擁有的任何(子)動物串列提供這一功能的最佳方法是什么?
我可以說什么是行不通的,這是顯而易見的方法:
我可以說什么是行不通的,這是顯而易見的方法。
public void printNames(List< Dog> list){
for(Dog d : list){
System.out.println(d.getName())。
}
}
因為這拋出了nameClash:兩個方法都有相同的擦除效果
。uj5u.com熱心網友回復:
這取決于你打算對結果做什么。 研究"PECS"會有幫助。 在這種情況下,你可以使用通配符來解決,但也可能涉及到通用方法和其他技術。
public void printNames(List< ? extends Animal> list){
for(動物a : list){
System.out.println(a.getName())。
}
}
你也可以直接使用toString()方法,這可能更好。
public void printAnything(List<?> list){
for(Object a : list){
System.out.println(a.toString())。
}
}
uj5u.com熱心網友回復:
我想知道最終的解決方案是什么?
一個通配符:
public void printNames(List< ? extends Animal> list){或者,如果你需要做一些事情,比如把你從
list中取出的東西放進list中,那么就需要一個型別變數:public <A extends Animal> void printNames(List<A> list){轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/318631.html
標籤:
上一篇:來自一個通用介面的擴展函式
下一篇:使用flutter2.5運行測驗出錯:"加載"_test.dart"失敗。Shell子行程干凈地結束了。main()是否呼叫exit()?"
