无法从静态上下文引用内部类,但仅限于外部类是通用的

Tom*_*Tom 5 java generics inner-classes

以下内容无法编译:

class Outer<T> {
    class Inner {

    }

    static class Nested {
        Inner inner; // Error: Outer.this cannot be referenced from a static context
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我删除<T>,它会编译.为什么不一致?

另外,如果我说Outer.Inner inner;,而不是Inner inner;,它编译.再次,为什么不一致?

我希望在所有情况下都是错误,或者没有错误.谁能解释一下发生了什么?

Bli*_*lip 4

为什么不一致?

我想说这根本不是矛盾。这基本上是一个对泛型的理解问题。考虑以下代码(您修改后的代码):

class Outer<T> {
    class Inner{
        T t;//Added this extra line
    }

    static class Nested {
        Inner inner; 
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,与您所写的有些相似,只是我添加了一个新的t类型变量,它是类中T类的泛型。现在,在上面的示例中,将无法编译,因为类中存在非静态或运行时引用,因此,当您在静态类中声明时OuterInnerInnerInnerNested声明时,JAVA 编译器不知道T仅在运行时声明的类型,所以你会得到一个错误。但在你的情况下,你没有做任何类似的事情,但编译器仍然不知道类似的东西是否存在。所以它给出了错误。

T现在,在第二种情况下,您已从Outer. 所以不可能声明变量tInner类中声明变量,因此不会出现错误。

在第三种情况下,您声明了Outer.Inner变量的类型inner并且编译成功。这里编译器认为OuterRAW TYPE。但应该避免这种类型的原始类型声明。所以最好这样写:

 Outer<?>.Inner inner;
Run Code Online (Sandbox Code Playgroud)

这里Java编译器考虑Outer将任何对象作为继承的参数Object