私は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<? extends Object>
の代わりにList<String>
のdelcaringです。誰かがこれを説明できますか?
(期限が過ぎても受け入れます) – lucasvw
良い点、私は 'を追加したいですか? extends Object'は効果なしで '?'に置き換えることができます – Andrew
@Andrew:確かに、同じ原則が 'Object'だけでなくワイルドカードの下限にも適用されます。 –