Angelica Langer dice nella sua FAQ sui farmaci generici (vedi Technicalities.FAQ822):override un metodo generico per un generico in Java
Se i metodi hanno parametri di tipo con diversi limiti, allora non ignorare, perché i metodi hanno firme che non sono equivalenti a override. Ricorda, i limiti del parametro tipo fanno parte di la firma di un metodo generico.
Esempio (di metodi sottotipo generici sovraccarico Supertype generico metodi; non raccomandati):
class Super { public <T> void set(T arg) { ... } public <T> T get() { ... } } class Sub extends Super { public <S extends Number > void set(S arg) { ... } // overloads public <S extends Number > S get() { ... } // overloads }
non capisco il motivo per cui il metodo get
è sovraccarico in classe Sub
. Per quello che so dovrebbe essere un errore in fase di compilazione perché get
ha la stessa firma sia in Sub
che in Super
(il tipo di reso non fa parte di esso).
Cosa mi confondere ancora di più è che l'IDE sto usando per testare il codice (IntelliJ IDEA 14.0.3) evidenzia get
in Sub
come un errore di compilazione con il messaggio successivo:
'get () 'in' Sub 'si scontra con' get() 'in' Super '; entrambi i metodi hanno la stessa cancellazione, ma nessuno dei due ha la precedenza sull'altro.
Ma quando eseguo il programma, esso viene compilato ed eseguito senza problemi. Suppongo che ci sia una specie di bug in IntelliJ quando analizza il codice, e cosa è corretto è ciò che Angelica dice nelle sue FAQ. Ma non riesco a capire il punto.
In Eclipse è possibile impostare il compilatore incorporato per essere più rigoroso e considerare alcune condizioni come errori (come l'assegnazione a self o l'accesso a un metodo statico attraverso un'istanza). Suppongo che lo stesso si possa fare anche in IDEA. – biziclop
Qual è il problema che si verifica è che il parametro di tipo del metodo sottoposto a override non ha gli stessi limiti come il parametro di tipo del metodo dalla super classe. –
Come detto nel post che citi, _ i limiti del parametro di tipo fanno parte della firma di un metodo generico_. Quindi ' T get()' e '
S get()' ha diverse firme. Il clash del nome è ancora brutto, quindi è così che il poster dice che non è raccomandato_ –