Встроенная реализация статических вложенных интерфейсов - PullRequest
1 голос
/ 15 июня 2019
View.setOnClickListener( new View.OnClickListener(){
    @override
    public void onClick(View view){
            //Some code implementing this method
              }
      });

Здесь OnClickListener - статический интерфейс, объявленный внутри View.Поскольку он статический, он не будет отнесен к классу Inner (поправьте меня, если я ошибаюсь).

Тогда как мы можем использовать анонимный класс для встроенной реализации этого статического вложенного интерфейса?

Поскольку, как я знаю, они используются только для встроенной реализации внутренних классов, которые являются вложенными типами без статического ключевого словадля закрытого типа.

1 Ответ

1 голос
/ 15 июня 2019

Прежде всего: внутренние интерфейсы по умолчанию являются «статическими». Невозможно иметь «внутренний» интерфейс, который не был бы статичным! См. здесь , чтобы узнать больше об этом аспекте.

С этой точки зрения интерфейсы - это всего лишь интерфейсы. Не имеет значения, являются ли они интерфейсом верхнего уровня, расположенным в собственном файле .java, или интерфейс находится в каком-то классе или около того.

И любой интерфейс может быть реализован с использованием анонимного внутреннего класса.

Это действительно все, что нужно для этого.

Чтобы ответить на комментарий:

так встроенная реализация, т.е. сам анонимный класс, становится внутренним классом интерфейса, который он реализует?

Нет, анонимный внутренний класс - это внутренний класс класса, который его окружает. Это происходит для реализации некоторого интерфейса. Это не внутренний класс интерфейса. Внутренний действительно подразумевается в «физическом» смысле, как в строках кода, содержащихся внутри других блоков кода.

class Outer {
  class/interface Inner {

Inner называется внутренним классом / интерфейсом, потому что он живет внутри Outer.

...