如何使用泛型参数覆盖具有Object参数的方法?

时间:2011-11-29 23:53:48

标签: java generics parameters type-erasure

我想覆盖参数类型为Object的方法:

public void setValue(Object value) {
    // ...
}

并使该参数具有泛型类型T

@Override
public void setValue(T value) {
    super.setValue(value);
}

我怎样才能用Java做到这一点?

在Eclipse中我遇到了这些错误:

Multiple markers at this line
- The type parameter T is hiding the type T
- Name clash: The method setValue(T) of type TextField<T> has the 
 same erasure as setValue(Object) of type JFormattedTextField but does not 
 override it
- The method setValue(T) of type TextField<T> must override or 
 implement a supertype method

2 个答案:

答案 0 :(得分:4)

你不能使重写方法接受比它重写的方法更窄的类型。

如果可以,可以采取以下措施:

class A {
    public setValue(Object o) {…}
}

class B<T> extends A {
    @Override
    public setValue(T o) {…};
}

A a = new B<String>(); // this is valid
a.setValue(new Integer(123)); // this line would compile, but make no sense at runtime 

答案 1 :(得分:-2)

使用:

<T extends Object> public void setValue(T o) {…};

然后a.setValue(new Integer(123));没有问题。只需定义为A a = new B();您可以通过将Object替换为所需的类来缩小范围。