Java: внутренний класс интерфейса (из google guice)


Я просматривал исходный код Google guice и нашел незнакомый фрагмент кода. Было бы здорово узнать, если бы кто-то мог это прояснить.

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

Теперь я вижу строки ниже в

public static final Scope SINGLETON = new Scope() {
    public <T> Provider<T> scope(final Key<T> key, final Provider<T> creator) {
      return new Provider<T>() {
.........
}

Он присваивает экземпляр внутреннего класса статической переменной, но Scope — это интерфейс, определенный как (в)

публичный интерфейс

Часть 1:

Можно ли создать интерфейс?? или это краткий синтаксис для анонимной реализации интерфейса??

Часть 2:

Если кто-нибудь может объяснить, что автор подразумевает под несколькими вложенными классами выше (Scope и Provider), и почему имеет смысл реализовать этот способ, это поможет мне понять. благодаря.


person bsr    schedule 31.12.2010    source источник
comment
возможный дубликат Похоже, создать объект из интерфейса; как это работает?   -  person Bert F    schedule 31.12.2010
comment
@Bert, согласен, этот вопрос не относится к guice, это общий вопрос о Java.   -  person Mike Miller    schedule 07.01.2011
comment
@Mike - хорошие глаза - теги обновлены для будущих искателей   -  person Bert F    schedule 07.01.2011


Ответы (2)


Блок {} после создает анонимный внутренний класс, реализующий заданный интерфейс.

Также часто встречается с Runnable.

person Thorbjørn Ravn Andersen    schedule 31.12.2010
comment
спасибо за разъяснения, подтверждающие мое предположение. Можете ли вы дать какой-нибудь указатель на часть, которую я правильно отметил в qn. еще раз спасибо за ваше время. - person bsr; 31.12.2010
comment
После вызова компилятор видит, что это Scope, и вы можете использовать его только как таковой, поскольку его нельзя привести ни к чему другому (помните, что у него нет имени, которое вы могли бы использовать). Причина этого просто в том, что вы хотите, чтобы Scope возвращал Provider, и автор не видел причин для предоставления какой-либо из них именованной реализации. Наверное, из-за простоты. - person Thorbjørn Ravn Andersen; 31.12.2010

Можно ли создать экземпляр интерфейса? или это краткий синтаксис для анонимной реализации интерфейса?

Да и да.

Кажется, это создает объект из интерфейса; как это работает?

Что означает синтаксис в Java: new Stream‹Integer›(){ .. . }?

В примере 3.11 интерфейс Enumeration создается на http://docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

public java.util.Enumeration enumerate() {
  // The anonymous class is defined as part of the return statement
  return new java.util.Enumeration() { 
      ....
  };  // Note the required semicolon: it terminates the return statement
}

Если кто-нибудь может объяснить, что автор имеет в виду несколькими вложенными классами выше

Ничего особенного во вложенности - оба являются анонимными классами и используют анонимный класс по той же причине, по которой вы используете анонимные классы где-либо еще: когда у вас есть одноразовая реализация для интерфейса или подкласса, т.е. у вас нет причин отделять определение/реализацию от использовать.

person Bert F    schedule 31.12.2010