[英]Java Generics create list of objects which extends class A and implements interface B
Consider this scenario 考虑这种情况
public abstract class A{
}
public interface B{
}
How would I create a List of objects which extend A and implement B? 如何创建扩展A并实现B的对象列表?
List<? extends A implements B> list = new List();
Thanks 谢谢
As i know, this is not supported with wildcard generics. 据我所知,通配符泛型不支持此功能。 This can be done with Type generics.
这可以使用Type泛型来完成。
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. 这与声明
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.