2

クラスでジェネリックを使用しています。MyObjectは、クラスとしてTを使用する必要があります(例:new MyObject(Long.class))。等しいメソッドでは、メソッドに与えられた引数がTのインスタンスであることを確認したいと思います。

Object<T>有効なJavaソースではありません。これをコード例に追加して、意味を示します。つまり、その値はTのインスタンスです。

しかし、equalメソッドを実装する正しい方法は何ですか?

public class MyObject<T extends Class> {

    public boolean equal(Object<T> value) {
        return true;
    }
}
4

3 に答える 3

1

equals()メソッドをオーバーライドする場合は、同等性を比較するために使用されているオブジェクトのクラスを確認する必要があります。

  1. 署名は、あなたが任意のパスを渡すことができることを示しますObject
  2. 異なるオブジェクトタイプ間で同等性を定義できます(頻繁には発生しませんが、有効です)

オーバーライドしない場合はequals()、メソッド名を区別できるように変更します。そうでなければ、人生は非常に混乱するでしょう。

于 2012-10-26T10:03:09.387 に答える
0

あなたがオーバーライドするために出ていないことを前提としていますObject.equals(Object)

T extends ClassClassとにかくfinalであるため、ほとんど意味がありません。したがって、いくつかの場合にのみT可能性があります。次に、typeパラメーターにすることもできます。だからあなたはそれを次のようなものにしたいかもしれません:Class<U>UU

public class MyClass<T> {
  private Class<T> cl ;
  public MyClass(Class<T> cl) {
    this.cl = cl ;
    ...
  }
  public boolean equal(T value) {
    return true;
  }
}

そして、あなたは、例えば、書くことができますnew MyClass<Long>(Long.class)

clしかし、実行時にパラメータを保存する必要がありますか?通常は完全に省略しますので、と書くだけnew MyClass<Long>()です。

于 2012-10-26T10:11:04.573 に答える
0

Assuming that you don't want to override equals。私はあなたが以下をすべきだと思います

public class MyObject<T> {

    public boolean isEquals(T obj) {
        return false;
    };
}

あなたがに渡すのでClassあなたの場合の必要はありませんTypeMyObject

    MyObject<Long> myObject = new MyObject<Long>();
    myObject.isEquals(Long.valueOf(10);//It will only allow Long
    myObject.isEquals(10);             //Fails for int

参考文献

  1. ジェネリック型
  2. レッスン:ジェネリック
于 2012-10-26T10:06:43.070 に答える