Javaの動的変数と動的変数の解決のダイナミック/静的型の混乱が少しあります。Javaのようなstaticlly型言語の動的メソッド解決の背後にある理由
は考えてみましょう:
public class Types {
@Override
public boolean equals(Object obj){
System.out.println("in class Types equals()");
return false;//Shut-up compiler!
}
public static void main(String[] args){
Object typ = new Types();
typ.equals("Hi");//can do this as String is a subclass of Object
}
}
まず:参照変数typ
が型タイプのものであり、そうではありません!
ので静的な型オブジェクトとダイナミック型オーバーライドのためのタイプを持つ標準の背後にある理由は何ですか?
2番目:コンパイラに正しいequals()を呼び出すのに十分な情報がありませんか?
クラスの型にequals()がオーバーライドされていない場合は、Object.equals()
メソッドを呼び出すことができます。
このケースでは、Typesクラスがあり、コンパイラはそれを知っています。
なぜこれはオーバーロードのような早期バインディングではありませんか?なぜそれをJVMに任せますか?
申し訳ありませんが、静的に間違っています。 –
参照変数 'typ'は静的型' Object'と実行時型 'Types'です。コンパイラは 'typ'が' Object'であることしか知りません。 – RealSkeptic