使用泛型编译失败?

Jok*_*ker 2 java generics core

我写了以下代码,它的工作原理非常好.问题是当我将类更改A为Generics时,A<T>它无法编译.

public class A {
    class B {
    }

    static void m(B i) {
    }

    static class C extends B {
        C() {
            new A().super();
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

当我更改AA<T>编译失败并出现以下错误B.

无法对非静态类型B进行静态引用

public class A<T> {
    class B {
    }

    static void m(B i) {
    }

    static class C extends B {
        C() {
            new A().super();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我为什么它在第一种情况下工作正常并且第二次失败

And*_*ner 6

在一般情况下,当你提到时B,你实际上指的是一个实例A<T>.B.

除非你有一个封闭的实例,否则你A<T>实际上是在尝试将原始引用括起来A.这是不允许的,因为B想要引用与其封闭实例关联的类型变量,该变量不存在.

在非通用情况下,没有类型变量,因此B不会尝试引用不存在的东西.

最简单的解决方案是A<T>明确添加,例如

static void m(A<?>.B obj)
Run Code Online (Sandbox Code Playgroud)

要么

static <T> void m(A<T>.B obj)
Run Code Online (Sandbox Code Playgroud)

static class C<T> extends A<T>.B {
    C() {
        new A<T>().super();
    }
}
Run Code Online (Sandbox Code Playgroud)