@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 doItmetodo non fa nulla di Tspecifico. 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";
}
}