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

4

2 回答 2

3

I'm not sure where you're seeing any class nested within C. That section actually says

It is a compile-time error to refer to a type parameter of a generic class C anywhere in:

  • the declaration of a static member of C (§8.3.1.1, §8.4.3.2, §8.5.1), or
  • the declaration of a static member of any type declaration nested within C, or
  • a static initializer of C (§8.7), or
  • a static initializer of any class declaration nested within C.

Here's an example to demonstrate what each bullet is disallowing:

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
    }
}
于 2012-09-08T20:43:35.853 回答
1

(移动到回答空间/格式。)

唯一引用此声明的地方:

在以下任何地方引用泛型类 C 的类型参数是编译时错误:

  • C 的静态成员的声明(§8.3.1.1、§8.4.3.2、§8.5.1),或
  • 嵌套在 C 中的任何类型声明的静态成员的声明,或
  • C 的静态初始化程序(第 8.7 节),或
  • 嵌套在 C 中的任何类声明的静态初始化程序。
于 2012-09-08T20:43:48.040 回答