简体   繁体   中英

Implementing generic interface

I have an interface Exec

public interface Exec<T, U> {
    U execute(final T context);
}

Now can I have a class which implements interface Exec as below

public class BatchExec<T, U> implements Exec<List<T>, List<U>>

My doubt is Exec accepts T and U as type parameters and in this case we are passing it as List and List but BatchExec expects T and U?

As Oliver Charlesworth pointed out, the the U and T in the BatchExex<...> are different than those in Exec<T, U> . Ie if you declare BatchExec like this:

public class BatchExec<T, U> implements Exec<List<T>, List<U>>

Then the execute method signature will contain List<T> and List<U> :

public List<U> execute(List<T> context)

This might be confusing so let's create an OtherbatchExec with other type parameters:

public class OtherBatchExec<P, Q> implements Exec<List<P>, List<Q>> {
    @Override
    public List<Q> execute(List<P> context) {
        return null;
    }

}

Just to demonstrate it, you can invoke their constructor the same exact way:

Exec<List<String>, List<Integer>> exec = new BatchExec<String, Integer>();
Exec<List<String>, List<Integer>> otherExec = new OtherBatchExec<String, Integer>();

For the sake of readability, I added the type parameters to the constructor call too. You can use the diamond operator too:

Exec<List<String>, List<Integer>> exec = new BatchExec<>();
Exec<List<String>, List<Integer>> otherExec = new OtherBatchExec<>();

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