【问题标题】:How to override method having Object parameter with a generic parameter?如何用泛型参数覆盖具有 Object 参数的方法?
【发布时间】:2011-11-29 23:53:48
【问题描述】:

我想重写一个参数类型为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

【问题讨论】:

标签: java generics parameters type-erasure


【解决方案1】:

您不能让覆盖方法接受比它覆盖的方法更窄的类型。

如果可以的话,以下是可能的:

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 

【讨论】:

  • 但是为什么a.setValue(new Integer(123)); 不能工作,因为Integer 继承自Object
  • @Jonas:因为变量a 拥有一个B&lt;String&gt; 类型的对象,而B 中的覆盖方法将被调用。变量的类型与方法绑定无关,它存储的对象的类型才是。
【解决方案2】:

用途:

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

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

【讨论】:

  • 这不起作用:Multiple markers at this line - Syntax error on token "public", delete this token - The method setValue(T) of type TextField&lt;T&gt; must override or implement a supertype method - Name clash: The method setValue(T) of type TextField&lt;T&gt; has the same erasure as setValue(Object) of type JFormattedTextField but does not override it
  • 试试TextField&lt;T extends Object&gt;
  • 不,它不起作用。而且您的方法签名是错误的。它应该返回void
  • 对我来说,使用 而不是简单的 有帮助。 +1
猜你喜欢
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
  • 2020-07-16
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多