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;,它编译.再次,为什么不一致?
我希望在所有情况下都是错误,或者没有错误.谁能解释一下发生了什么?
为什么不一致?
我想说这根本不是矛盾。这基本上是一个对泛型的理解问题。考虑以下代码(您修改后的代码):
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. 所以不可能声明变量t在Inner类中声明变量,因此不会出现错误。
在第三种情况下,您声明了Outer.Inner变量的类型inner并且编译成功。这里编译器认为Outer是 RAW TYPE。但应该避免这种类型的原始类型声明。所以最好这样写:
Outer<?>.Inner inner;
Run Code Online (Sandbox Code Playgroud)
这里Java编译器考虑Outer将任何对象作为继承的参数Object。
| 归档时间: |
|
| 查看次数: |
743 次 |
| 最近记录: |