Java Generics创建扩展A类并实现接口B的对象列表

时间:2017-11-23 22:19:52

标签: java generics

考虑这种情况

public abstract class A{

}

public interface B{

}

如何创建扩展A并实现B的对象列表?

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

由于

2 个答案:

答案 0 :(得分:0)

据我所知,通配符泛型不支持此功能。这可以使用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
}

答案 1 :(得分:0)

你也可以使用'&amp;'运算符并将未知类声明为类型参数,如下所示。声明class XXX extends B implement A的优点是,您的代码可以使用任何满足约束的类,而不仅仅是XXX后代。

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