2016-08-23 18 views
1

なぜこの場合、doAction(A a)が選択されますか?javaの継承でこのメソッド呼び出しの解決方法を教えてください。

引数の種類に応じてメソッドの選択について読んでください。のdoAction(A)は、このような状況で選択されるのはなぜ

class A { } 
class B extends A { } 
class D { 
    void start(A a){ 
     doAction(a); 
    } 
    void doAction(A a) { 
     System.out.println("A action"); 
    } 
    void doAction(B b) { 
     System.out.println("B action"); 
    } 
} 
public class Test { 
    public static void main(String[] args) { 
     new D().start(new B()); 
    } 
} 
+0

実行時のタイプに基づいて選択する方法を尋ねていないので、実際にはそれが重複しているかどうかはわかりません。しかし答えはまだ関連しています... –

答えて

4

これは唯一の適用可能な方法だからです。オーバーロードの解決は、のコンパイル時で行われ、のコンパイル時には、型の引数が使用されます。 (引数の型)からB(パラメータの型)への暗黙的な変換がないため、doAction(B)メソッドは適用されません。その時点で、両方の方法が適用可能である

doAction((B) a); 

が、オーバーロードの解決はdoAction(A a)よりより具体的なものとしてdoAction(B b)を選ぶだろう:あなたはこのようなBに値をキャストすることができます。もちろん、でない参照を、Bのインスタンスに渡すと、失敗します。

オーバーロード解決の詳細については、JLS 15.12.2を参照してください。

関連する問題