我遇到过一些我在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。 –