我遇到過一些我在Java中發現奇怪的東西,並且無法找到關於它的很多信息。請看下面的代碼:泛型和抽象方法
public class TestClass {
private static abstract class AbstractClass {
abstract List<? extends Object> getList();
abstract Map<Long, List<? extends Object>> getMap();
}
private static final class ConcreteClass extends AbstractClass {
@Override
List<String> getList() {
return null;
}
@Override
Map<Long, List<String>> getMap() {
return null;
}
}
}
編譯器顯示了getMap()
方法的錯誤:
getMap() in ConcreteClass cannot override getMap() in AbstractClass
return type Map<Long, List<String>> is not compatible with Map<Long, List<? extends Object>>
但同樣的錯誤是不存在的getList()
方法,但我希望兩個都上班或兩者都失敗。在這兩種情況下,首要的方法是刪除List<String>
以代替List<? extends Object>
。有人可以解釋這個嗎?
很好的答案,謝謝! (我會接受時間限制後) – lucasvw
的好處,我想補充'?擴展Object'可以被替換爲'?'而沒有任何影響 – Andrew
@Andrew:當然,但是相同的原則適用於通配符上的任何下界,而不僅僅是Object。 –