ho due interfacce che assomigliano a questo:Java Tipo di ritorno automatico di covarianza con sottoclassi generico
interface Parent<T extends Number> {
T foo();
}
interface Child<T extends Integer> extends Parent<T> {
}
Se ho un Parent
oggetto grezzo, chiamando foo()
default di tornare un Number
poiché non v'è alcun tipo di parametro.
Parent parent = getRawParent();
Number result = parent.foo(); // the compiler knows this returns a Number
Questo ha senso.
Se si dispone di un oggetto Child
grezzo, mi aspetto che chiamando foo()
restituisca un Integer
con la stessa logica. Tuttavia, il compilatore afferma che restituisce un valore Number
.
Child child = getRawChild();
Integer result = child.foo(); // compiler error; foo() returns a Number, not an Integer
posso ignorare Parent.foo()
in Child
per risolvere questo problema, in questo modo:
interface Child<T extends Integer> extends Parent<T> {
@Override
T foo(); // compiler would now default to returning an Integer
}
Perché accade questo? C'è un modo per avere il valore predefinito Child.foo()
per la restituzione di Integer
senza sovrascrivere Parent.foo()
?
MODIFICA: Fingere Integer
non è definitivo. Ho appena scelto Number
e Integer
come esempi, ma ovviamente non erano la scelta migliore. : S
Penso che sia perché senza l'override del bambino, il figlio eredita il metodo 'foo' del genitore, e, secondo il genitore,' T' è un 'Numero'. Per 'foo' nel parent per restituire un' Integer', dovrebbe conoscere le informazioni sulle sue classi figlio, quale tipo di interruzione della gerarchia ... –
try 'interfaccia Child estende Parent < T estende Intero> ' –
fukanchik
@fukanchik che non è nemmeno Java valido. –