Ich bin auf etwas gestoßen, das ich in Java seltsam finde und ich konnte nicht viele Informationen darüber finden. Betrachten Sie den folgenden Code ein:Generika und abstrakte Methoden
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;
}
}
}
Der Compiler zeigt einen Fehler auf der getMap()
Methode:
getMap() in ConcreteClass cannot override getMap() in AbstractClass
return type Map<Long, List<String>> is not compatible with Map<Long, List<? extends Object>>
Aber den gleichen Fehler ist für die getList()
Methode nicht vorhanden ist, aber ich würde erwarten, dass entweder beide arbeiten oder beide versagen. In beiden Fällen ist die übergeordnete Methode List<String>
anstelle von List<? extends Object>
delcaring. Kann jemand das erklären?
Große Antwort, danke! (Ich werde akzeptieren, nachdem das Zeitlimit abgelaufen ist) – lucasvw
der gute Punkt, ich möchte hinzufügen? extends Object 'kann durch'? 'ohne irgendeinen Effekt ersetzt werden – Andrew
@Andrew: Sicher, aber das gleiche Prinzip gilt für jede Untergrenze auf dem Platzhalter, nicht nur für' Object'. –