在变量中使用多个类型的泛型Java通配符
我知道在方法和类的情况下,可以使用多种类型进行通配符,但是变量呢?例如,我是否可以要求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;
}
}
# 1 楼答案
Java不支持类的多重继承——一个类只能扩展一个类(尽管一个类可以实现多个接口)。因此我相信
没用
解决方案是创建一个超级类型,扩展a&;然后将类型传递给您的方法。差不多
# 2 楼答案
是的:
看起来有点奇怪,您必须在使用泛型“类型”的范围之外为它定义一个别名,但它是有效的。我发现使用该方法最容易看到:
T2
从未在方法声明中使用。它只在方法内部使用不幸的是,这些内部类型限制以这种方式成为公共API的一部分,但这是我所知道的唯一可行的方法
如果您不想这样做,那么在您的示例中尝试一个内部私有接口(
AB
)