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

どこを見ているのかわかりませんany class nested within 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
    }
}
于 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 に答える