@BD at Rivenhill: Puisque cette vieille question a retenu l'attention l'année dernière, continuons un peu, juste pour le plaisir de la discussion. Le corps de votre doIt
méthode ne fait rien de T
spécifique. C'est ici:
public class Clazz<T> {
static <T> void doIt(T object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
Vous pouvez donc supprimer entièrement toutes les variables de type et simplement coder
public class Clazz {
static void doIt(Object object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
D'accord. Mais revenons au problème d'origine. La première variable de type sur la déclaration de classe est redondante. Seul le second sur la méthode est nécessaire. C'est reparti, mais ce n'est pas encore la réponse définitive:
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";
}
}
Cependant, c'est trop de bruit pour rien, car la version suivante fonctionne de la même manière. Tout ce dont il a besoin est le type d'interface sur le paramètre de méthode. Aucune variable de type en vue nulle part. Est-ce vraiment le problème d'origine?
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";
}
}