@BD a Rivenhill: da quando questa vecchia domanda ha ottenuto rinnovata attenzione lo scorso anno, continuiamo un po ', solo per motivi di discussione. Il corpo del tuo doIt
metodo non fa nulla di T
specifico. Ecco qui:
public class Clazz<T> {
static <T> void doIt(T object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
Quindi puoi eliminare completamente tutte le variabili di tipo e solo il codice
public class Clazz {
static void doIt(Object object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
Ok. Ma torniamo più vicini al problema originale. La prima variabile di tipo nella dichiarazione di classe è ridondante. È necessario solo il secondo sul metodo. Eccoci di nuovo, ma non è ancora la risposta finale:
public class Clazz {
static <T extends Saying> void doIt(T object) {
System.out.println("shake that booty "+ object.say());
}
public static void main(String args[]) {
Clazz.doIt(new KC());
Clazz.doIt(new SunshineBand());
}
}
// Output:
// KC
// Sunshine
interface Saying {
public String say();
}
class KC implements Saying {
public String say() {
return "KC";
}
}
class SunshineBand implements Saying {
public String say() {
return "Sunshine";
}
}
Tuttavia, tutto è troppo complicato per nulla, poiché la seguente versione funziona allo stesso modo. Tutto ciò che serve è il tipo di interfaccia sul parametro del metodo. Nessuna variabile di tipo in vista da nessuna parte. Era davvero il problema originale?
public class Clazz {
static void doIt(Saying object) {
System.out.println("shake that booty "+ object.say());
}
public static void main(String args[]) {
Clazz.doIt(new KC());
Clazz.doIt(new SunshineBand());
}
}
interface Saying {
public String say();
}
class KC implements Saying {
public String say() {
return "KC";
}
}
class SunshineBand implements Saying {
public String say() {
return "Sunshine";
}
}