java - 内部类中的泛型

标签 java generics compiler-warnings inner-classes unchecked

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

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

同时,虽然我可以在构造函数外部声明数组变量时添加类型,但在创建数组时却无法这样做(我得到“无法创建 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;
        }
    }
}

最佳答案

If I have one class (Class1) which takes the type E and also has an internal class (Class2) which I also want to take type E which should be the same as the E of Class1 in all cases.

所以你不应该在类及其内部类中声明两次泛型:。
事实上,不要使内部类成为泛型类,而是在内部类中使用外部类中声明的 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 类型在内部类中确实可见,因为内部类可以访问封闭类的其他成员(包括该类的泛型)。

关于java - 内部类中的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49237123/

相关文章:

java - 重定向到 URL 时无法访问 SpringMVC Controller 中的请求参数

rust - 如何抑制源自宏的Clippy警告?

eclipse - Eclipse编译器错误/警告首选项

objective-c - 如何修复 "Protocol Not Implemented"

Java API Streams 在 Map 中收集流,其中值为 TreeSet

java - 在 Java 中用 "<"或 ">"运算符比较两个对象

java - 在一行中将 child 列表转换为 parent 列表

c# - 根据通用接口(interface)获取类属性

通过 MakeSignature.signDeferred 进行外部签名时,Java iText 5 签名无效

java - 工厂返回通用接口(interface)