Общая ошибка документации внутреннего класса jls7

class Jls7error<T extends OutputStream> {
    class Jls7errorInner<S extends T> {
        public S out;
    }
}

Согласно документации Oracle jls7, этот код не должен компилироваться:

It is a compile-time error to refer to a type parameter of a generic class C anywhere in
...
• any class nested within 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.


person Roberto Mereghetti    schedule 08.09.2012    source источник
comment
Для дальнейшего использования существует HTML-версия JLS что позволит вам напрямую ссылаться на раздел, о котором вы говорите.   -  person Jeffrey    schedule 09.09.2012
comment
я не понимаю; Я не вижу пункта, который вы цитируете.   -  person Dave Newton    schedule 09.09.2012
comment
документация говорит мне: вы не можете ссылаться на параметр типа T класса Jls7error во внутреннем классе Jls7errorInner, тем не менее код компилируется без ошибок.   -  person Roberto Mereghetti    schedule 09.09.2012


Ответы (2)


Я не знаю, где вы видите 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
    }
}
person Jeffrey    schedule 08.09.2012

(Перемещено, чтобы ответить на пробел/форматирование.)

Единственное место, которое ссылается на это, гласит:

Ошибкой времени компиляции является обращение к параметру типа универсального класса C в любом месте:

  • объявление статического члена C (§8.3.1.1, §8.4.3.2, §8.5.1) или
  • объявление статического члена любого объявления типа, вложенного в C, или
  • статический инициализатор C (§8.7) или
  • статический инициализатор любого объявления класса, вложенного в C.
person Dave Newton    schedule 08.09.2012
comment
Новая версия pdf уже правильная. Можно ли удалить этот пост? - person Roberto Mereghetti; 09.09.2012
comment
@RobertoMereghetti Я вижу точно такой же текст в PDF-файле, на который вы ссылаетесь. - person Dave Newton; 09.09.2012
comment
Спасибо, у меня была предыдущая версия того же pdf, там документацию уже поправили. Можно ли удалить этот пост? - person Roberto Mereghetti; 09.09.2012
comment
@RobertoMereghetti Невозможно удалить вопросы после публикации ответов, но вы можете ответить на свой вопрос. - person Jeffrey; 09.09.2012