2012-01-20 9 views
8

私は(例えば、personB.heightpersonA.heightを比較)Comparableを実装するクラスPersonを持っている場合、それはジャワ - のcompareToとオペレータ

personA.compareTo(personB) == -1? 

の代替として

personA < personB 

を使用することが可能ですこれに何か問題はありますか、またはオペレータに過負荷をかける必要がありますか?

答えて

6

Javaに演算子のオーバーロードがありません。あなたはおそらくC++のバックグラウンドから来るでしょう。

あなたはcompareToメソッドを使用する必要があります。

14

いいえ、代替としてpersonA < personB使用することはできません。また、Javaで演算子をオーバーロードすることもできません。

また、私はあなたが今持っているどのようなおそらくあなたのクラスのために働く

personA.compareTo(personB) < 0 

personA.compareTo(personB) == -1 

を変更することをお勧めしたいです。しかし、compareTo()の契約はpersonA未満personBあるとき、それは負の値を返すということです。その負の値は-1である必要はなく、別のクラスで使用するとコードが壊れる可能性があります。クラスのcompareTo()メソッドを別の(しかし依然として準拠した)実装に変更すると、それも壊れてしまう可能性があります。

1

Javaに演算子のオーバーロードがありません、はい、問題があります。これは不可能です。


に建てられたいくつかのオーバーロード、もちろん、あります:整数型、浮動小数点型で、かつStringの上+オペレータの作品が。しかし、自分自身を定義することはできません。

5

これはできません。 Javaはオペレータのオーバーロード(組み込みのオーバーロードに加えて)をサポートしていません。ところで

は、代わりに== -1を書いて、あなたは< 0を記述する必要があります。 compareToは、負の/ゼロ/正の値を返すだけで、特に-1/0/1では返されません。

1

オブジェクトに適用された場合いいえ、「<は」コンパイルされません。また、あなたのテストのように注意してください:

personA.compareTo(personB)==-1 

APIドキュメントは、単にオブジェクトは必ずしも-1ではありません指定されたオブジェクト、未満であるときのcompareTo()が負の整数を返すと言います。代わりに

personA.compareTo(personB) < 0 

を使用してください。

1

これは可能ではありませんが、Javaでは演算子のオーバーロードが発生しません。
しかし、もっとOOオプションは、私見、それが非表示になりますので、より読みやすいあなたは

if(personA.isTallerThan(personB)){ 

} 

を書くことができます

if(personA.compareTo(personB) > 0){ 

} 

を書くので、代わりに人

public boolean isTallerThan(Person anotherPerson){ 
    return this.compareTo(anotherPerson) > 0; 
} 

内のメソッドを追加することですJavaの詳細ではなくドメイン言語で表現されています。

+0

+1私は 'isTallerThan'に同意します、私はちょうどそれを考えていました。 –