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; }
}

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

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

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

@Override  
^  

2 个错误

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

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

4

2 回答 2

8

你应该做

public class Derived<T> extends Base<T>

您需要指定<T>forBase否则您将不得不通过简单地声明Listiewithout generics来覆盖方法

于 2012-10-25T21:09:55.080 回答
1

您还可以像这样在类声明中传递类型参数:

    public class Derived extends Base<SomeConcreteType> {

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

如果您不再需要抽象类的泛型部分,因为您将在派生类中使用具体类型。否则,您必须按照其他答案所述进行操作。

于 2012-10-25T21:24:45.937 回答