class Jls7error<T extends OutputStream> {
class Jls7errorInner<S extends T> {
public S out;
}
}
根据jls7 Oracle文档,此代码不应编译:
在任何地方引用泛型类C的类型参数是编译时错误
...
•嵌套在C中的任何类
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.2
(第185页,docs.oracle.com / javase / specs / jls / se7 / jls7.pdf)
实际上,这段代码可以在我的jdk 1.7上编译和运行
这是文档错误吗?
编辑: 这是PDF版本中的文档错误。 Oracle更正了html和pdf文档中的文档。
答案 0 :(得分:3)
我不确定你在哪里看到any class nested within C
。该部分实际上说
引用泛型的类型参数是编译时错误 C级中的C级:
- C的静态成员声明(§8.3.1.1,§8.4.3.2,§8.5.1)或
- 声明嵌套在C或
中的任何类型声明的静态成员- C(第8.7节)的静态初始化程序,或
- 嵌套在C。
中的任何类声明的静态初始值设定项
以下是一个示例,说明每个子弹不允许的内容:
public class Foo<T> {
private static T t; // first bullet makes this a compiler error
static {
T t; // third bullet makes this a compiler error
}
private static class Bar {
private static T t; // second bullet makes this a compiler error
static {
T t; // fourth bullet makes this a compiler error
}
}
private class Baz {
private static T t; // second bullet again
// you can't have a static initializer
// in a non-static nested class
}
}
答案 1 :(得分:1)
(已移动回答空格/格式。)
唯一引用此内容的地方:
在以下任何地方引用泛型类C的类型参数是编译时错误:
- C的静态成员声明(§8.3.1.1,§8.4.3.2,§8.5.1)或
- 声明嵌套在C或
中的任何类型声明的静态成员- C(第8.7节)的静态初始化程序,或
- 嵌套在C。
中的任何类声明的静态初始值设定项