@BD в Ривенхилле: Так как этот старый вопрос привлек к себе новое внимание в прошлом году, давайте немного поговорим ради обсуждения. Тело вашего doIt
метода вообще ничего не делает T
. Вот:
public class Clazz<T> {
static <T> void doIt(T object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
Таким образом, вы можете полностью удалить все переменные типа и просто код
public class Clazz {
static void doIt(Object object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
Хорошо. Но вернемся ближе к исходной проблеме. Первая переменная типа в объявлении класса является избыточной. Нужен только второй метод. Здесь мы идем снова, но это еще не окончательный ответ:
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";
}
}
Тем не менее, это слишком много шума ни о чем, так как следующая версия работает точно так же. Все, что ему нужно, это тип интерфейса для параметра метода. Никаких переменных типа не видно нигде. Была ли это действительно оригинальная проблема?
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";
}
}