jls7泛型内部类文档错误

时间:2012-09-08 20:23:03

标签: java generics documentation inner-classes

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文档中的文档。

2 个答案:

答案 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。
  • 中的任何类声明的静态初始值设定项