有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在变量中使用多个类型的泛型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;
    }

}

共 (2) 个答案

  1. # 1 楼答案

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

    ArrayList<? extends A & B> 
    

    没用

    解决方案是创建一个超级类型,扩展a&;然后将类型传递给您的方法。差不多

    inteface C extends A,B{}
    
    ArrayList<? extends C>
    
  2. # 2 楼答案

    是的:

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

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

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

    如果您不想这样做,那么在您的示例中尝试一个内部私有接口(AB