如何正确重写具有泛型签名的抽象方法

3
我原以为我知道如何做这件事,但是我遇到了一些意想不到的行为,所以显然我漏掉了什么东西。以下是问题的核心。
基础类:
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; }
}

基类编译通过,但是当我编译派生类时出错:

Derived.java:3: Derived is not abstract and does not override abstract method foo(java.util.List) in Base

public class Derived extends Base
^
Derived.java:5: method does not override or implement a method from a supertype

@Override  
^  

2 errors

参数 List<? extends T> 的通用性似乎是问题的原因。如果我在两个签名中将该部分替换为基本类型 int,它就会编译通过。
有人可以告诉我这里发生了什么吗?
2个回答

8

你应该做什么

public class Derived<T> extends Base<T>

您需要为Base指定<T>,否则您将不得不通过简单声明List(即不使用泛型)来覆盖方法。

哇,这么简单的解决方案。我猜我已经习惯了当我忘记指定泛型类型时编译器警告的提示,但在这种情况下它并没有给出警告。 - Graphics Noob

1

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

    public class Derived extends Base<SomeConcreteType> {

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

如果您不再需要抽象类的通用部分,因为您将在派生类中使用具体类型,则可以删除它。否则,您必须执行其他答案所述的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接