Почему анонимный класс не может реализовать несколько интерфейсов напрямую?Просто из-за синтаксиса или есть другая причина? - PullRequest
24 голосов
/ 23 января 2011

Внутренняя проблема, почему java анонимные классы не могут реализовать и создать подкласс одновременно? Или это только потому, что синтаксис?

Ответы [ 5 ]

25 голосов
/ 24 ноября 2011

Есть внутренняя проблема, почему анонимные классы Java не могут реализовать и создать подкласс одновременно?

Я полагаю, что это 99% из-за синтаксических причин.Параметры типов даже поддерживают типы пересечений (<T extends InterfaceX & InterfaceY>), поэтому я не думаю, что такая особенность привнесет какие-либо противоречия или сложности.

Выражение типа new (InterfaceX & InterfaceY)() { ... } может, например, быть скомпилировано вчто-то вроде

interface InterfaceXandY extends InterfaceX, InterfaceY {}
... new InterfaceXandY() { ... }

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


В некоторой связанной заметке,Вы можете позволить лямбда-реализации, например, Serializable, выполнив

Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");

См. Как сериализовать лямбду?

6 голосов
/ 23 января 2011

Анонимные классы предоставляются как способ быстро и лаконично создать «одноразовый» класс.Ваш вопрос предполагает, что вы пытаетесь использовать свой класс anon несколькими способами (по крайней мере, один интерфейс и один расширяемый).В этом случае было бы более удобочитаемым и более понятным, если вы повысите класс до полного класса.

Это также предотвратит непредвиденные побочные эффекты, улучшив управление инкапсуляцией ваших классов.

6 голосов
/ 30 октября 2011

Нашел взломать вокруг этого

создайте интерфейс внизу вашего файла, который расширяет все интерфейсы, которые вы хотите реализовать, затем создайте анонимный класс, который реализует это.

6 голосов
/ 23 января 2011

только синтаксис, так называемые анонимные классы - это 100% нормальные классы. возможно, вы можете получить забавные результаты, используя java.lang.reflect.Proxy и InvocationHandler, это будет самый грязный способ сделать это.

Более простые способы включают объявление класса в методе и просто добавление 'Implements',

4 голосов
/ 12 марта 2013

Согласно Джеймсу Госслингу :

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

Интересно, что теперь в Java добавляются лямбда-выражения и замыкания,Время, оснащенное чем-то отличным от внутренних классов, мы могли бы определить объект на лету, состоящий из более чем одного интерфейса, при условии, что вторым является маркерный интерфейс.сборка JDK 8 (12 марта 2013 г.).Так что, похоже, на этот раз они больше думают об этой проблеме.

...