Generic实例作为方法参数

时间:2012-10-26 10:00:49

标签: java class generics

我在课堂上使用泛型。 MyObject 必须使用T作为类,例如新的MyObject(Long.class)。在 equal 方法中,我想确保给该方法的参数是T的实例。

我知道

Object<T>不是有效的Java源代码。 我将它添加到代码示例中以向您显示我的意思,即该值是T的实例。

但是实现等于方法的正确方法是什么?

public class MyObject<T extends Class> {

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

3 个答案:

答案 0 :(得分:1)

如果你覆盖了equals()方法,那么你应该检查用于比较相等性的对象的类。

  1. 签名将表明您可以通过任何Object
  2. 可以在不同的对象类型之间定义相等性(通常不会发生,但它是有效的)
  3. 如果您没有覆盖equals(),我会将您的方法名称更改为 distinct 。否则生活将变得非常混乱。

答案 1 :(得分:0)

Assuming that you don't want to override equals。我认为你应该在下面做

public class MyObject<T> {

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

当您将Class传递给Type

时,您的案例中不需要MyObject
    MyObject<Long> myObject = new MyObject<Long>();
    myObject.isEquals(Long.valueOf(10);//It will only allow Long
    myObject.isEquals(10);             //Fails for int

参考

  1. Generic Types
  2. Lesson: Generics

答案 2 :(得分:0)

假设您以覆盖Object.equals(Object)

T extends Class没有多大意义,因为Class无论如何都是最终的,所以对T Class<U> 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>()参数吗?通常你会把它完全留下来,所以你只需要写{{1}}。