[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/ )