Il metodo in overload più specifico in effetti è superfluo, in quanto verrebbe chiamato solo e unicamente se gli passi un Set2 che ha una istanziazione del tipo parametrico che è accettabile per il tipo del reference su cui invochi il metodo equals.Originariamente inviato da LiLyblack
Per la equals sono abituata a scrivere due funzioni, una che tratta gli Object, e quindi fa overriding, e una che ha come parametro il tipo specifico con cui sto lavorando, in maniera tale che invocata la equals su un'istanza di Set fa overloading del metodo più adatto, quello che approssima meglio il tipo statico dell'oggetto in input.
E complicherebbe le cose se si volesse estendere la tua classe. Ammetti di voler fare una sottoclasse SubSet2 anch'essa parametrica. Che fai .. metti un metodo equals che prende un SubSet2??? Così ce ne sarebbe uno in più.
Per via della "erasure". La erasure di una type variable (la tua T) è Object oppure il tipo del bound più a sinistra, se ha dei bound.Originariamente inviato da LiLyblack
ma sicuramente non è così. Perché non è così?
Se tu avessi messo:
public class Set2 <T extends Number> {
(per limitare l'uso di Set2 solo con tipi da Number in giù)
allora la erasure di T sarebbe Number.
Usando Object come parametro per equals. E comunque non avrebbe senso che tu metta un equals che accetta un T. Se tu avessi un Set2<String> non ha senso che tu verifichi se è uguale a un String.Originariamente inviato da LiLyblack
Allora come faccio a fare overriding?
Questo è quello che ho io:Originariamente inviato da LiLyblack
Sui Generici ho diversi problemi, soprattutto perhé non riesco a trovare una trattazione completa di questo argomento (soprattutto sulla sintassi); nemmeno fra i tutorial della Sun. Temo che essendo un argomento abbastanza recente non sia ancora molto consolidato in letteratura.
Java Generics and Collections

Rispondi quotando