简体   繁体   中英

How to properly override an abstract method with generics in the signature

I thought I understood how to do this but I'm getting some unexpected behavior so apparently I'm missing something. Here's the problem boiled down.

Base Class:

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

Derived Class:

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

The Base class complies fine, but when I compile the Derived class I get:

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

The generics of the parameter List<? extends T> List<? extends T> appears to be the cause of the problem. If I replace that part in both signatures with the basic type int it comples fine.

Can anybody tell me what's going on here?

You should do

public class Derived<T> extends Base<T>

You need to specify <T> for Base otherwise you will have to override method by simply declaring List iewithout generics

You can also pass the type parameter in your class declaration like this:

    public class Derived extends Base<SomeConcreteType> {

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

if you no longer need the generic part of the abstract class because you are going to use a concrete type in your derived class. Otherwise you have to do what the other answer stated.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM