Java Generics create list of objects which extends class A and implements interface B

Viewed 4016

Consider this scenario

public abstract class A{

}

public interface B{

}

How would I create a List of objects which extend A and implement B?

List<? extends A implements B> list = new List();

Thanks

2 Answers

As i know, this is not supported with wildcard generics. This can be done with Type generics.

public abstract class A{}
public interface B{}

public class Match extends A implements B{}
public class NotMatch1 implements B{}
public class NotMatch2 extends A{}

public class MyChecketList<T extends A&B> extends ArrayList<T>{}

public void use(){
    List<Match> a = new MyChecketList<>();//valid
    List<NotMatch1> b = new MyChecketList<>();//compiler error
    List<NotMatch2> c = new MyChecketList<>();//compiler error

    MyChecketList<Match> d = new MyChecketList<>();//valid
    MyChecketList<NotMatch1> e = new MyChecketList<>();//compiler error
    MyChecketList<NotMatch2> f = new MyChecketList<>();//compiler error
}

You can also use '&' operator and declare the unknown class as a type parameter like below. The advantage of this vs declaring a class XXX extends B implement A is that your code will work with any such a class that satisfy the constraints not just XXX descendants.

import java.util.*;

interface A {};

class B {};

class Test {

    public <T extends B & A> List<T> asList(Collection<T> elements) {
        List<T> result = new ArrayList<>(elements.size());
        for (T element : elements) result.add(element);
        return result;
    }
}
Related