5

重複の可能性:
オーバーライドせずにEqualsメソッドからfalseを返す

今日、同僚の1人が私に質問をしました。

TestEqualsクラス(カスタムまたはユーザー定義クラス)を記述して、コード内の以下のsopが出力されるようにしますfalse

public class Puzzle3 {
  public static void main(String[] args) {
    TestEquals testEquals = new TestEquals();
    System.out.println(testEquals.equals(testEquals));
  }
}

注:equalsメソッドをオーバーライドすることはできません。

よく考えましたが、equalsをオーバーライドしないと解決策を見つけることができませんでした。

4

5 に答える 5

17

使用する

public boolean equals(TestEquals equals) {
    return false
}

equalsをオーバーライドするには、入力パラメーターがobject型である必要があるため、上記のコードスニペットは理論的にはobjectメソッドからのequalsをオーバーライドしません。

于 2012-08-30T18:47:15.173 に答える
11

編集:どうやら他の誰かが最初に別のスレッドでこのアイデアに到達したようですが、このコードは非常に単純なので、ここに残しておきます。


class TestEquals {

  static {
    System.setOut(new PrintStream(new FilterOutputStream(System.out) {
      public void write(byte[] buf, int pos, int len) throws IOException {
        if (len >= 4 && buf[pos] == 't') {
          out.write(new byte[] {
              (byte) 'f', (byte) 'a', (byte) 'l', (byte) 's', (byte) 'e'
            });
          out.write(buf, pos + 4, len - 4);
        } else {
          out.write(buf, pos, len);
        }
      }
    }));
  }
}

この恐ろしいハックは、との関係をオーバーライドしたりオーバーロードしたりすることはありませんがequals、のインスタンスを作成するという行為TestEqualsにより、クラスがロードされてラップされ、最初の4バイトの代わりにでSystem.out始まる後続の印刷't'が印刷されます。"false"(デフォルトのエンコーディングは超エキゾチックなものではないと仮定します。)

于 2012-08-30T18:56:57.727 に答える
1

上記のように、次のようなメソッドを作成できます。

public boolean equals(TestEquals e) {
    return false;
}

さらに、TestEquals他のオブジェクトを拡張できる場合:

public TestEquals extends Something {
}

public Something {
    @Override public boolean equals(Object o) {
        return false;
    }
}
于 2012-08-30T18:51:24.893 に答える
0

なぜ誰もがそれをしたいのか分かりません。ただし、以下に示すようにメソッドを作成できます。

public boolean equals(SuperEquals equals) { return false; }

SuperEqualsのスーパークラスはどこにありますが、そうでTestEqualsはありませんObject

于 2012-08-30T18:47:19.083 に答える
-1

私のiPadでは...戦略は、getを実行するたびに変更されるaun属性を持つようなものでなければなりません。これは、equalsのgetterを介して属性にアクセスする場合に機能します。イコールはオーバーライドできないため、属性はプライベートである必要があり、値の変更は値の読み取りの前後に行われ、イコールの最初の部分であるか2番目の部分であるかに関係なく機能することを確認します。

次のようなもの(構文エラーが発生した場合は申し訳ありません):

public class TestEquals{

 private int id;

 public int getId(){
    int temp;
    id++;
    temp=id;
    id++;
    return temp;
 }
}
于 2012-08-30T19:02:06.000 に答える