Il sovraccarico va bene. Ma se consideriamo che abbiamo due oggetti ObjectA e objectB. Entrambi hanno variabile "id" e "name". Vorrei scrivere un metodo (in terza classe), che restituisce il nome dell'oggetto dato. Scrivere funzioni sovraccariche mi fa ripetere il codice. È una buona pratica? Non sarebbe meglio usare invece le funzioni generiche?Utilizzo di metodi generici come alternativa al sovraccarico?
Quindi, so che posso scrivere una funzione sovraccaricata, sth. così:
public String getInfo(ObjectA o){
if(o.getId()!=1) return o.name;
return "";
}
public String getInfo(ObjectB o){
if(o.getId()!=1) return o.name;
return "";
}
E funziona bene. Ma entrambe le funzioni sono identiche! L'unica differenza è il fatto, hanno bisogno di una discussione del diverso tipo. Perché sembrano uguali, non sta violando la regola DRY? Ho provato a scrivere un metodo generico semplice, ma IDE sta contrassegnando that.getId e that.name() come errore e consiglio di lanciarlo come ((ObjectA) che) .getId() o ((ObjectB) che) .getId (). Non ho fatto che nella linea" T = che clazz.cast (o) ;? Quello che sto facendo male?
public <T> String getInfo(Class<T> clazz, Object o) {
T that = clazz.cast(o);
if (that.getId()!=1) return that.name;
return "";
}
In generale vorrei sapere, se la mia idea è possibile. Come può o è meglio semplicemente scrivere funzioni sovraccariche?
Una tipica soluzione potrebbe essere quella di garantire che sia Objecta e ObjectB implementare un'interfaccia che dichiara i metodi hasName e hasid. –
Dato che 'T' viene cancellato in' Object', il precedente non verrà compilato, poiché 'Object.getId()' non è un metodo effettivo. Come altri hanno suggerito, avresti bisogno di avere un'interfaccia comune su cui è definito 'getId'. –
@AndyTurner Il tipo di cancellazione non immette l'immagine qui, è pura algebra di tipo. Il _upper bound_ di 'T' è' Object'. Le conseguenze della cancellazione si verificano solo in fase di esecuzione (e in alcuni casi degenerati in fase di compilazione, ma solo a causa della svolta specifica sulla cancellazione in Java). –