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

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

基类:

public abstract class Base { abstract public void foo(List l); } 

派生类:

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

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

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

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

 @Override ^ 

2个错误

参数List的generics List似乎是问题的原因。 如果我用基本类型int替换两个签名中的那个部分,它就可以了。

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

你应该做

 public class Derived extends Base 

您需要为Base指定 ,否则您将必须通过简单地声明List iewithoutgenerics来覆盖方法

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

  public class Derived extends Base { @Override public void foo(List l) { // ... } } 

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