Mi sono imbattuto in qualcosa che trovo strano in Java e non sono riuscito a trovare molte informazioni su di esso. Si consideri il seguente codice:Metodi generici e astratti
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;
}
}
}
Il compilatore mostra un errore sul metodo getMap()
:
getMap() in ConcreteClass cannot override getMap() in AbstractClass
return type Map<Long, List<String>> is not compatible with Map<Long, List<? extends Object>>
Ma lo stesso errore non è presente per il metodo getList()
, ma mi sarei aspettato uno sia per lavorare o sia per fallire. In entrambi i casi, il metodo di sostituzione è delcaring List<String>
al posto di List<? extends Object>
. Qualcuno può spiegarlo?
Ottima risposta, grazie! (Accetterò dopo che il limite di tempo è scaduto) – lucasvw
il punto buono, mi piacerebbe aggiungere '? extends Object' può essere sostituito con '?' senza alcun effetto – Andrew
@Andrew: certo, ma lo stesso principio vale per qualsiasi limite inferiore sul carattere jolly, non solo 'Object'. –