@BD в Rivenhill: Оскільки це старе питання було оновлено увагою минулого року, давайте трохи підемо, просто заради обговорення. Основа вашого 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";
}
}