2

我在课堂上使用泛型。MyObject必须使用 T 作为类,例如 new MyObject(Long.class)。在方法equal中,我想确保给方法的参数是 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(),我会将您的方法名称更改为distinct。否则生活会很混乱。

于 2012-10-26T10:03:09.387 回答
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 回答
0

假设您打算覆盖Object.equals(Object)

T extends Class没有什么意义,因为Class无论如何都是最终的,所以唯一的T可能是Class<U>some U,然后你不妨让U成为类型参数。所以你可能想要它:

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 回答