2

、およびキャストequals(Object o)を使用せずにオーバーライドしたい。これは Java で実行可能ですか? はいの場合、どのように可能ですか? 編集:私もこの方法を使いたいです。例: クラス Cow でこのメソッドをオーバーライドし、それを使用して自分の Cow が他の Cow と論理的に等しいかどうかを確認したいですか?instanceofgetClass()

回答ありがとうございます。私の主な問題は次のとおりです。 Car を他のクラスとして牛または他のオブジェクトに送信するとどうなりますか。オブジェクトがメソッドを取得したかどうかを確認するにはどうすればよいですかgetName()(私の牛がこのメソッドを取得したと仮定します)?

4

2 に答える 2

2

もちろん。

シリアルCow化可能にし、そのシリアル化された形式が正規であることを確認し(最悪の場合、Externalizable正規である独自のシリアル化を実装して手書きします)、次の手順を実行しますequals

  1. 引数をシリアル化してみてください。それが失敗した場合は、falseを返します。
  2. シリアル化しthisます。
  3. 2つのシリアル化されたバイトを比較します。

シリアルフォームにはタイプを識別する文字列が含まれているため、さまざまなタイプのインスタンスを区別するために必要なバイトが含まれています。

これは簡単ではなく、非効率的で、おそらくメンテナンスの悪夢であり、間違いなく最初の選択肢ではないはずですが、Javaコードで利用できる言語トリックがあり、instanceof同一Class性チェックなしでタイプを区別できることを示しています。

ただし、注意点が1つあります。シリアル形式では、異なるクラスローダーにロードされた同じ名前のクラスが区別されません。

于 2012-12-10T19:41:32.427 に答える
1

同等の基準が、オブジェクトからのみ入手可能な情報を使用することに限定されている場合、それは確かに可能です。

これは/思われる/ありそうにない...のメソッドequalsのみを使用している場合、なぜオーバーライドするのでしょうか? Objectただし、これが設計に適している場合は、それを行うことを妨げるものは何もありません。

Javadocs で定義されているコントラクトを維持していることを確認してください。equals()

于 2012-12-10T19:37:49.217 に答える