2

昨日も同様の質問をしましたが、別の問題が発生しました。

class Cat {
    public void isClawedBy(Cat c, Kitten k){
        System.out.println("Clawed by a cat");
    }
}

class Kitten extends Cat{
    public void isClawedBy(Kitten k, Cat c){
        System.out.println("Clawed by a Kit");
    }
}


Cat g = new Cat();
Cat s = new Kitten();
Kitten t = new Kitten();

g.isClawedBy(s,t);
s.isClawedBy(t,s);
t.isClawedBy(t,t);

私が混乱している問題は周りt.isClawedBy(t,t);です。s.isClawedBy(t,s);s は静的型 cat であるため、エラーがスローされることを理解しています。

しかしt.isClawedBy(t,t);、「メソッド isClawedBy(Kitten, Cat) は、タイプ Kitten に対してあいまいです」というエラーがスローされます。コードを変更した場合、t.isClawedBy(s,t);またはt.isClawedBy(t,s);動作しますが、(t、t) で動作しない理由が不明です。

前もって感謝します

4

4 に答える 4

1

Java では、メソッド呼び出しは動的に解決されます。メソッドを呼び出すと、JVM は署名に一致するメソッド、つまりメソッド名、パラメーターの型、および戻り値の型を見つけようとします。これは、使用されるクラスのメソッド テーブルを調べることによって行われます。このテーブルには、スーパー タイプのメソッド シグネチャも含まれます。

メソッド テーブル内のシグネチャが適切かどうかをチェックする場合、パラメーター (および戻り値) の型のスーパータイプが考慮されます。の場合、matches で定義されたメソッドとmatches でt.isClawedBy(t,t)定義されたメソッドとして一致できる 2 つのメソッドがあります。これらは異なるパラメーター タイプを持つため、異なるメソッドであることに注意してください。KittenCat

2 つの異なるメソッドが一致するため、メソッド呼び出しはあいまいです。

isClawed(s,t)子猫のようにisClawed(t,s)あいまいさはなく、s猫になることはできません。

于 2013-06-10T23:07:35.660 に答える
1

Kittens はsであるためあいまいですCat

したがって、与えられた:

Cat    isClawedBy(Cat c, Kitten k)
Kitten isClawedBy(Kitten k, Cat c)

の場合Kitten、両方の方法を使用できます。AKittenは であるため、 2 つの引数を指定して をCat呼び出すと、署名に適合します。同様に、を 2 つ指定して呼び出すと、シグネチャも一致します。Cat.isClawedBy(Cat, Kitten)KittenKitten.isClawedBy(Kitten, Cat)Kitten

どのメソッドが意図されているかをコンパイラが判断する方法はありません。

于 2013-06-10T23:05:09.310 に答える
0

そのメソッドをオーバーライドしなかったためです。

実行する方法が 2 つあります。t.isClawedBy(t,t);猫の爪を立てる方法と、子猫の爪を伸ばす方法です。

メソッドをオーバーライドするには、パラメーターが同じでなければなりません。

于 2013-06-10T23:05:00.513 に答える