@BD em Rivenhill: Como essa pergunta antiga ganhou atenção renovada no ano passado, vamos continuar um pouco, apenas por uma questão de discussão. O corpo do seu doIt
método não faz nada T
específico. Aqui está:
public class Clazz<T> {
static <T> void doIt(T object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
Então você pode descartar inteiramente todas as variáveis de tipo e apenas codificar
public class Clazz {
static void doIt(Object object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
Está bem. Mas vamos voltar mais perto do problema original. A primeira variável de tipo na declaração de classe é redundante. Somente o segundo no método é necessário. Aqui vamos nós novamente, mas ainda não é a resposta final:
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";
}
}
No entanto, é muito barulho por nada, já que a versão a seguir funciona da mesma maneira. Tudo o que precisa é do tipo de interface no parâmetro method. Não há variáveis de tipo à vista em qualquer lugar. Esse era realmente o problema original?
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";
}
}