[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 10147] Re: 動的実行メソ ッド決定はなぜされないのか
高橋(智)です。
Wataru Fukushima wrote:
snip
> と書くと、barはMyClassオブジェクトのインスタンスですが、型宣言がObject型
> であるために、MyClass#equals(Object)メソッドが呼ばれます。
> (実行時の型に影響されない)
>
> このことは言語規定(JLS)で定められています。
>
> (2)のパターンでも、MyClass#equals(MyClass)メソッドを呼んで欲しいと思うの
> は、私だけでしょうか…?
> それとも、今のような仕様になっている理由があるのでしょうか?
snip
仮に java.lang.Object の実装が以下のようになっていたら、
福嶋さんの望む動作になりませんか?
遅そうだけど...
-------------------------------------------------------------------
import java.lang.reflect.*;
public class Object {
...
...
public boolean equals(Object that) {
try {
Class c1 = this.getClass();
Method m1 = c1.getMethod("equals", new Class[]{c1});
Boolean retval = (Boolean)m1.invoke(this, new Object[]{that});
return retval.booleanValue();
}
catch(Exception e) {
return false;
}
}
...
...
}
-------------------------------------------------------------------
public class MyClass {
private int x = 99;
public MyClass() {
}
public boolean equals(MyClass that) {
if( that == null ) {
return false;
}
return this.x == that.x;
}
}
-------------------------------------------------------------------
public class MyTest {
public static void test1() {
MyClass foo = new MyClass();
MyClass bar = new MyClass();
boolean fooEqualsBar = foo.equals(bar);
}
public static void test2() {
MyClass foo = new MyClass();
Object bar = new MyClass();
boolean fooEqualsBar = foo.equals(bar);
}
public static void main(String[] args) {
test1();
test2();
}
}
-------------------------------------------------------------------
--
高橋智宏
Java読書会( http://www.t3-jpn.com/bof/ )
T3-Japan( http://www.t3-jpn.com/ )