私はDeitalの本読んだ:「Javaのどのようにプログラムを」、および一般的な章に文章が書かれている: "コンパイラは正確にメソッドの呼び出しに一致するメソッド宣言が見つからない場合は、ことができますが、2つ以上の方法を見つけるんメソッド呼び出しを満たす、コンパイル・エラー」が発生します。誰かが私は、コンパイルエラーの上に取得することが、成功しなかったのでとき、状況の私の例を与えることができます。私のコード:
public class Animal
{
public Animal ()
{
}
public String bark()
{
return "Animal";
}
}
public class Dog extends Animal
{
public String bark()
{
return "howhow";
}
}
public class DogSon extends Dog
{
public String bark()
{
return "I'm Dog Son";
}
}
public class Test
{
public static void main(String[] args)
{
Test t = new Test();
DogSon d = new DogSon();
System.out.println(t.helpMethod(d));
}
public <T extends Dog> String helpMethod(T dog)
{
System.out.println("aaa");
return dog.bark();
}
public <T extends Animal> String helpMethod(T animal)
{
return animal.bark();
}
}
まさに息子のオブジェクトを取得する方法がない、とスーツここにできる2つの一般的な方法がありますので。これはDeitalが話し状況ではないですか?
あなたが理解する必要が呼び出される汎用メソッドの消去
それはだ場合、メソッドの型パラメータをオブジェクトに変換され、意味結合していない
か
、それはだ最初のそれはだ時にバインドされたクラスのバインド。
バウンドあなたが行ったような手段は、あなたの例-で-stayingあなたは、別のクラスのTパラメータタイプの関係を宣言しています:
// 1. method
public <T extends Dog> String helpMethod(T dog)
// 2. method
public <T extends Animal> String helpMethod(T animal)
Tはれる犬に囲まれた 1の方法において、および動物に囲まれた 2方法で。
それはコンパイルに来るときので、Javaが変わるTの 2方法で1.の方法で、そして動物に犬に。
ここにはあいまいさがありません、彼らは2つの異なる方法があります。
しかし、あなたは3メソッドを宣言した場合:
// 3. method
public <T> String helpMethod(T dog)
そして、Tがある結合していない、あなたはそれがコンパイルに来るときので、Javaが変化し、Tと他のクラスとの関係を宣言していないオブジェクトにTを。
さて、あなたは4メソッドを宣言しようとする場合:
// 4. method
public String helpMethod(Object dog)
あるでしょうコンパイルエラー型消去時の3方法はまったく同じだろうと、メソッドのシグネチャをご4.方法として。
コンパイラは、あなたが呼び出すしたいかを決めると、エラーがスローすることはできません。
心の中で上記で、短い答えは次のとおりです。
あなたのコードでは、次の2つの異なる方法を使用している、エラーが発生しないので、何のあいまいさはありません。
あなたがそのコンパイル・エラーを表示したい場合は、その署名のあなたのクラスで既存の汎用/非ジェネリックメソッドと同じになりますコンパイルした後、別の汎用メソッドを宣言する必要があります。