如何在签名中使用泛型正确覆盖抽象方法

时间:2012-10-25 21:07:40

标签: java generics inheritance

我以为我明白了怎么做但是我得到了一些意想不到的行为所以显然我错过了一些东西。这是问题归结起来的。

基类:

public abstract class Base<T>
{
    abstract public void foo(List<? extends T> l);
}

派生类:

public class Derived<T> extends Base
{
    @Override
    public void foo(List<? extends T> l) { return; }
}

Base类符合要求,但是当我编译Derived类时,我得到:

  

Derived.java:3:Derived不是抽象的,不会覆盖Base中的抽象方法foo(java.util.List)

     

public class Derived扩展Base          ^
  Derived.java:5:方法不会覆盖或实现超类型

中的方法
@Override  
^  
     

2个错误

参数List<? extends T>的泛型似乎是问题的原因。如果我用基本类型int替换两个签名中的那个部分,它就会很好。

有谁能告诉我这里发生了什么?

2 个答案:

答案 0 :(得分:8)

你应该做

public class Derived<T> extends Base<T>

您需要为<T>指定Base,否则您必须通过简单地声明List来覆盖方法,即不使用泛型

答案 1 :(得分:1)

您还可以在类声明中传递type参数,如下所示:

    public class Derived extends Base<SomeConcreteType> {

        @Override
        public void foo(List<SomeConcreteType> l) {
            // ...
        }
    }

如果您不再需要抽象类的通用部分,因为您将在派生类中使用具体类型。否则你必须做其他答案所说的。