4

findbugsについて関連する質問をしましたが、もっと一般的な質問をしましょう。

ポリモーフィズムが可能なオブジェクト指向言語で作業していると仮定します。

言語が静的型チェック(Java、C ++など)をサポートしているとします。

言語がパラメータの分散を許可しないと仮定します(たとえば、Java、再び...)

Objectをパラメーターとして受け取る等式操作をオーバーライドする場合、パラメーターが、呼び出されたLHSと同じタイプまたはサブタイプではない状況でどうすればよいですか?

オプション1-オブジェクトが明らかに等しくないため、falseを返します

オプション2-言語が実際に分散をサポートしている場合(これが望ましい)、コンパイル時にエラーとしてキャッチされるため、キャスト例外をスローします。したがって、別のタイプが送信される状況は違法であるはずなので、実行時にこのエラーを検出することは理にかなっています。

4

5 に答える 5

3

オプション1に投票します。異なるタイプの2つのオブジェクトが等しくなる可能性があります。たとえば、intとdoubleは、ファーストクラスのオブジェクトの場合、互いに有効にキャストでき、数学的に比較できます。また、いくつかの点で異なるサブクラスを同等と見なしたい場合もありますが、どちらも他のサブクラスにキャストできない場合があります(同じ親から派生している場合もあります)。

于 2008-12-12T23:28:13.907 に答える
1

オブジェクトが等しくないため、falseを返します。

ここで投げるのがどれほど良いかわかりませんClassCastException

Collectionのようなインターフェースには、他のオブジェクトとの同等性Listをチェックできるオブジェクトに実際に依存するコントラクトがあります。

于 2008-12-12T23:25:33.303 に答える
0

場合によります。

SomeClass obj1 = new SomeClass();
object other = (object)obj1;

return obj1.Equals(other); // should return "true", since they are really the same reference.

SomeClass obj1 = new SomeClass();
object other = new object();

return obj1.Equals(other); // should return "false", because they're different reference objects.

class SomeClass { }
class OtherClass { }

SomeClass obj1 = new SomeClass();
OtherClass obj2 = new OtherClass();

return obj1.Equals(obj2); // should return "false", because they're different reference objects.

タイプが互いに継承しない2つの完全に異なるタイプである場合、それらを同じ参照にする方法はありません。

基本オブジェクトクラスをパラメータとして受け入れているため、どのタイプのキャスト例外もスローしないでください。

于 2008-12-12T23:25:03.990 に答える
0

うーん..次の4つの理由から、オプション1も好きです。

1)オブジェクトは、チェックに使用した条件によって明らかに等しくありませんでした

2)ClassCastExceptionをスローするには、比較を行うたびにその例外をチェックする必要があります。これは、コードが理解しにくくなるか、少なくとも長くなる原因になると思います...

3)クラスキャスト例外は、問題の症状にすぎません。つまり、タイプレベルでも、2つのオブジェクトが等しくありませんでした。

4)上記のユーザー「cbo」のように、タイプが異なっていても(4.0 == 4)double / intは等しく、これは他のタイプにも当てはまります。

免責事項:Pythonの方法でJavaの議論を彩らせるかもしれません:)

于 2008-12-13T00:41:58.033 に答える
0

Dobb博士のJavaQ&Aによると、ベストプラクティスは両方とも同じタイプであるということです。だから私はオプション1に投票します。

于 2008-12-13T00:55:03.420 に答える