【问题标题】:Generics in Inner Classes内部类中的泛型
【发布时间】:2018-03-12 14:00:14
【问题描述】:

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

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

同时,虽然我可以在构造函数之外声明数组变量时添加类型,但在创建数组时却不能这样做(我得到“Cannot create a generic array of Class1.Class2 em>”如果我尝试)。

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

/**
 * @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;
        }
    }
}

【问题讨论】:

  • Class2 可以使用 E 而不是泛型。技术上是Class1&lt;E&gt;.Class2
  • 泛型和数组不混合,由于具体化。使用列表或集合,而不是数组。

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


【解决方案1】:

如果我有一个类 (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 类型在内部类中确实可见,因为内部类可以访问封闭类的其他成员(包括类的泛型)。

【讨论】:

  • 如果 Class2 是一个内部 interface 怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多