継承されたインターフェイスを持つJavaオーバーロードメソッド
-
05-07-2019 - |
質問
私はJavaの動作を理解しようとしています。このインターフェースの使用:
public interface IA {}
public interface IB extends IA {}
public class myClass implements IB {}
次のようなメソッドをオーバーロードしています:
public void method(IA a);
public void method(IB b);
次のオブジェクトでメソッドを呼び出す場合:
IA a = new myClass();
method(a);
Javaが使用する理由:
public void method(IA a);
の代わりに
public void method(IB b);
?
ありがとう
解決
コンパイラは a
が IA
のインスタンスであることしか認識していないため。オーバーロードは、関連する式のコンパイル時タイプに基づいてコンパイル時に決定され、 a
のコンパイル時タイプは IA
です。
(オーバーライドと比較します。メソッドの実装は、関連する実際の型に基づいて実行時に選択されます。)
他のヒント
行
IA a = new myClass();
は、オブジェクトaをタイプIAとして定義します。これはコンパイラーが知っているすべてです。 aがIBであると仮定することはできません。これは、これが完全に成り立つ可能性があるためです。
public class MyClass2 implements IA{}
IA a = new MyClass2();
method(a);
この場合、例のようにaはIBではありません。そのため、コンパイラーは、ユーザーが指定したもの以外の型については何も仮定しません。そのため、IAを受け入れるメソッドを呼び出す必要があります。
" a"を渡すため、IA引数です。
所属していません StackOverflow