@BD at 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()
+ "' !!!");
}
// ...
}
Ok。しかし、元の問題に戻りましょう。クラス宣言の最初の型変数は冗長です。メソッドの2番目のものだけが必要です。ここでもう一度行きますが、それはまだ最終的な答えではありません:
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";
}
}