[英]Java Generics Wildcarding for a single param with multiple class types
[英]Java wildcarding with multiple types in variable
我知道在方法和类的情况下可以通配多种类型,但是变量呢? 例如,我是否可以要求ArrayList仅接受实现两个不在同一类型层次结构中的两个不同接口的元素? 请参阅下面的代码以了解我要执行的操作。
import java.util.ArrayList;
interface A {}
interface B{}
interface AB extends A, B{}
class D <T extends A & B> { //This works but this is a class
T variable;
}
public class C {
ArrayList<AB> myList1 = new ArrayList<AB>(); // compiles
ArrayList<? extends AB> myList3 = new ArrayList<AB>(); //compiles
//The following does not compile.
ArrayList<? extends A & B> myList4 = new ArrayList<AB>();
//This works but this is a method:
public static <T extends A & B> T someMethod(ArrayList<? extends T> list) {
return null;
}
}
是:
class C<T extends A & B> {
ArrayList<T> field;
public <T2 extends A & B> void method() {
ArrayList<T2> localVar;
}
}
您必须在使用它的范围之外为通用“类型”定义一个别名,这看起来有些奇怪,但是它可以工作。 我发现用该方法最容易看到:方法声明中从未使用过T2
。 它仅在方法内部使用。
不幸的是,这些内部类型限制以这种方式成为了公共API的一部分,但这是我知道实现此工作的唯一方法。
如果您不希望这样做,请在您的示例中尝试一个内部专用接口( AB
)。
Java不支持类的多重继承-一个类只能扩展一个类(尽管一个类可以实现多个接口)。 因此,我相信
ArrayList<? extends A & B>
不起作用。
解决方案是创建一个同时扩展A和B的超级类型,然后将该类型传递给您的方法。 就像是
inteface C extends A,B{}
ArrayList<? extends C>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.