Rivenhill'de @BD: Bu eski soru geçen yıl yeniden ilgi gördüğü için, sadece tartışma uğruna biraz ilerleyelim. Metodunuzun gövdesi doIt
hiçbir şey yapmaz T
-özellikle. İşte burada:
public class Clazz<T> {
static <T> void doIt(T object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
Böylece tüm tip değişkenlerini tamamen bırakabilir ve sadece kod yazabilirsiniz.
public class Clazz {
static void doIt(Object object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
Tamam. Ama asıl soruna geri dönelim. Sınıf bildirimindeki ilk tür değişkeni gereksizdir. Sadece yöntemde ikincisine ihtiyaç vardır. İşte yine başlıyoruz, ama son cevap henüz değil:
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";
}
}
Ancak, aşağıdaki sürüm aynı şekilde çalıştığından, hiçbir şey hakkında çok fazla karışıklık var. Tek ihtiyacı olan method parametresindeki arabirim türüdür. Görünürde hiçbir yerde değişken yok. Bu gerçekten asıl sorun muydu?
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";
}
}