内部类中的泛型

时间:2018-03-12 14:00:15

标签: java generics compiler-warnings inner-classes unchecked

对于嵌套类中的泛型类型,我有一个问题 如果我有一个类(Class1),其类型为 E ,并且还有一个内部类(Class2),我也想采用类型 E ,它应该是相同的在所有情况下,Class1的 E 。 Class2是一个私有内部类,因此它只会被Class1的实例使用;这意味着它永远不会有任何其他 E

但是,我从这段代码中得到了一堆警告;
首先,我得到“类型安全:在Class1构造函数中创建Class2数组时,类型Class1.Class2 []的表达式需要未经检查的转换以符合Class1.Class2 [] ”。 /> 然后我也在类2的类声明(私有类Class2 )中得到“类型参数E隐藏类型E

同时,虽然我可以在构造函数之外声明数组变量时添加类型,但在创建数组时我不能这样做(我得到“无法创建Class1.Class2的通用数组“如果我试试。”

如果我想要不产生任何警告的代码,我不太明白我该怎么做。我怎样才能摆脱上面提到的两个警告?

/**
 * @author you-know-who
 * @param <E>
 */
public class Class1<E> {

    public final E main;
    public final Class2<E>[] rest;

    public Class1(E main, E[] rest) {
        this.main = main;
        this.rest = new Class2[rest.length];
        int index = 0;
        for (E e : rest) {
            this.rest[index] = new Class2<E>(e);
            index++;
        }
    }

    /**
     * @author you-know-who
     * @param <E>
     */
    private class Class2<E> {
        public final E e;

        public Class2(E e) {
            this.e = e;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

  

如果我有一个类(Class1),它采用类型E并且还有一个   内部类(Class2),我也想采取类型E应该   在所有情况下都与Class1的E相同。

所以你不应该在类及其内部类中声明两次泛型: 实际上,不要使内部类成为泛型类,而是在内部类中使用外部类中声明的E,例如:

public class Class1<E> {

    public final E main;
    public final Class2[] rest;

    public Class1(E main, E[] rest) {
       ...
    }

    private class Class2 {
        public final E e;

        public Class2(E e) {
            this.e = e;
        }
    }
}

E类型确实在内部类中可见,因为内部类可以访问封闭类的其他成员(包括类的泛型)。