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

Gra*_*oob 3 java generics inheritance

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

基类:

public abstract class Base<T>
{
    abstract public void foo(List<? extends T> l);
}
Run Code Online (Sandbox Code Playgroud)

派生类:

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

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

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

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

@Override  
^  
Run Code Online (Sandbox Code Playgroud)

2个错误

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

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

Ami*_*nde 8

你应该做

public class Derived<T> extends Base<T>
Run Code Online (Sandbox Code Playgroud)

您需要指定<T>,Base否则您将必须通过简单地声明Listiewithout泛型来覆盖方法