2016-09-26 16 views
0

関連しているが、私は新しいC.doSomething(new Foo());を呼び出すと、印刷されます推測するのは、私がのJava - 同じ名前を持つ2つの方法で、異なる種類の同じ引数が、型が階層的に

Interface A { 
    public void doSomething(Object a); 
} 

Interface B { 
    public void doSomething(Foo b); 
} 

Class C implements A, B { 

    public void doSomething(Object a) { print("a"); } 
    public void doSomething(Foo b) { print("b"); } 

} 

があるとしましょう"b" FooはObjectを継承しています。

しかし、私はサブメソッドから共通の行動をしたい場合について:

Class C implements A, B { 

    public void doSomething(Object a) { print("common behavior from " + a); } 
    public void doSomething(Foo b) { doSomething((Object) b); } 
    public void doSomething(Bar c) { doSomething((Object) c);} 

} 

は、その仕事は私がFooBardoSomethingを呼び出すか、彼らが原因で無限ループになってしまいます終了は((Object) c) instanceof Bar == trueですか?

Javaはどのメソッドを呼び出すかをどのように定義しますか?

+0

あなたはそれを試して調べるべきです。 Javaはその動作を[specifications](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5)で定義しています。 – 4castle

答えて

2

オーバーロードの解決はコンパイル時に行われます。実行時のタイプがbまたはcであるかどうかは関係ありません。彼らがObjectとしてキャストされている限り、それはObjectを過負荷と呼ぶでしょう。したがって、あなたの例はうまくいくはずです。

もう1つの一般的な使用例は、リテラルnullをメソッドに渡し、オーバーロードのあいまいさを避けるために型にキャストする必要がある場合です。例えば。 c.doSomething((Foo)null)

+0

私はこれが好きです、私は 'ヌル'トリックについて知りませんでした。 – markspace

+0

ヌルパラメータを使用するのが良い例です。ありがとうございました。 – htafoya

関連する問題