带有多个变量类型的Java通配符

时间:2013-11-19 17:17:40

标签: java generics inheritance

我知道在方法和类的情况下可以使用多种类型的通配符但是变量呢?例如。我是否可以要求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;
    }

}

2 个答案:

答案 0 :(得分:4)

是:

class C<T extends A & B> {
    ArrayList<T> field;

    public <T2 extends A & B> void method() {
        ArrayList<T2> localVar;
    }
}

您必须在使用它的范围之外定义泛型“类型”的别名,但它有效,这看起来有点奇怪。我发现使用该方法最容易看到:T2从未在方法声明中使用。它仅用于方法内部。

不幸的是,这些内部类型限制以这种方式成为公共API的一部分,但这是我知道的唯一方法。

如果您不想这样做,请在示例中尝试使用内部私有界面(AB)。

答案 1 :(得分:1)

Java不支持多重继承类 - 一个类只能扩展一个类(尽管一个类可以实现多个接口)。因此,我相信

ArrayList<? extends A & B> 

不起作用。

解决方案是创建一个扩展A&amp; A的超级类型。 B然后将类型传递给您的方法。像

这样的东西
inteface C extends A,B{}

ArrayList<? extends C>