Почему я не могу использовать generics во внутреннем интерфейсе?

Я попытался скомпилировать следующий код:

public interface Foo<T> {
    public interface Bar {
        public void bar(T t);
    }

    void foo(T t);
}

Но я получаю эту ошибку: "Foo.this нельзя ссылаться из статического контекста".

В частности, я получаю его на "T" в баре (T t). Однако foo (T t) не дает такой же ошибки. Я не понимаю, почему это статический контекст и что на самом деле означает ошибка.

Ответы

Ответ 1

"Вложенный" интерфейс (Bar в вашем примере) неявно статичен. Таким образом, он не может получить доступ к конкретной информации о конкретном объекте, относящейся к Foo, например, к ее родовому типу.

См. например JLS # 8.5.1:

Пользовательский интерфейс неявно статичен