[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 10154] Re: 動的実行メソ ッド決定はなぜされないのか
福嶋です。
On Tue, 28 May 2002 22:19:33 +0900, according to the article
"[jfriends-ml 10151] Re: 動的実行メソッド決定はなぜされないのか"
Yoshiki Shibata <yshibata@xxxxxxxxxxxxxxxx> wrote:
> > 本の項目7には、
> >
> > public class MyClass {
> > public boolean equals(Object another) {
> > if (!(another instanceof MyClass)) {
> > return false;
> > }
> > :
> > }
> > }
> >
> > みたいにして判定していますが、メソッド引数にもポリモーフィズムを適用して、
> >
> > public class MyClass {
> > public boolean equals(Object another) {
> > return false;
> > }
> > public boolean equals(MyClass another) {
> > if (another == null) {
> > return false;
> > }
> > :
> > }
> > }
> >
> > と書いた方がすっきりするし応用が利くのでは? と思ったりする時があります。
>
>
> 細かいことですが、この実装では、項目7の最後の段落に書かれている「2つのメ
> ソッドが同じ結果を返す限り、受け入れられますが」に反していますね。
今の言語仕様では、確かに反しています。
> > ただし、呼び出すメソッドはコンパイル時に決まってしまうため、
> >
> > (1)
> > MyClass foo = new MyClass();
> > MyClass bar = new MyClass();
> > boolean fooEqualsBar = foo.equals(bar);
> >
> > と書けば、MyClass#equals(MyClass)メソッドが呼ばれますが、
> >
> > (2)
> > MyClass foo = new MyClass();
> > Object bar = new MyClass();
> > boolean fooEqualsBar = foo.equals(bar);
> >
> > と書くと、barはMyClassオブジェクトのインスタンスですが、型宣言がObject型
> > であるために、MyClass#equals(Object)メソッドが呼ばれます。
> > (実行時の型に影響されない)
>
> 上記の実装では、(2)のケースでequals(Object)が呼び出された時に、本当なら
> trueを返すべき時に、falseを返すことになります。あるいは、もっと分かり易
> くすると
>
> MyClass foo = new MyClass();
> Object bar = foo;
> boolean fooEualsBar = foo.equals(bar);
>
> でfalseになってしまいますね。そして、bar.equals(foo)はtrueになってしまい
> ますね。
はい。
ここで、
foo.equals(bar)
が、MyClass#equals(Object)を呼ぶのではなく、MyClass#equals(MyClass)を
呼ぶような言語仕様であればいいなぁ、と思ったのです。
----------------------------------------
(株)PFU ソフトプロダクト事業部第二開発部
福嶋 航 w.fukushima@xxxxxxxxxxxxxxx