2016-09-04 4 views
0

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

Класс «Анонимный класс, производный от Test» должен быть либо объявлен абстрактным или реализуют абстрактный «метод()» метод в тестеМожно ли объявить анонимный класс абстрактным?

код:

abstract class Test{ 
    abstract void method(); 
} 
Test o = new Test(){}; 


Если можно объявить анонимный класс как абстрактный, пожалуйста, дайте мне знать, как сделать это.
Я был бы благодарен за ответ.

+2

В каких обстоятельствах имеет смысл это сделать? –

+0

Вы не можете объявить анонимный абстрактный класс: по определению вы создаете экземпляр нового класса, когда объявляете анонимный класс, что означает, что он должен быть конкретным. –

+0

@OliverCharlesworth Как я уже говорил, я не вижу смысла, но я пытаюсь понять сообщение компилятора. –

ответ

5

См JLS Sec 15.9.5 (курсив мой):

15.9.5. Анонимные объявления классов

Объявление анонимного класса автоматически выводится из выражения создания экземпляра класса компилятором Java.

Анонимный класс не является абстрактным (§8.1.1.1).

Анонимный класс всегда неявно окончателен (§8.1.1.2).

Анонимный класс всегда является внутренним классом (§8.1.3); он никогда не статичен (§8.1.1, §8.5.1).

0

Вы не можете и не имеете смысла объявлять анонимный класс, поскольку абстрактный класс как анонимный используется как локальный класс только один раз.

я думаю, что вы получаете эту ошибку из-за подобной проблеме Class must either be declared abstract or implement abstract method error

0

Как цитирует Энди Тернер ответ на ваш вопрос НЕТ.

Однако, я думаю, вы хотели знать что-то другое.

Зачем это сообщение компилятора?

Ну, компилятор здесь немного вводит в заблуждение.Он предлагает два возможных решения, основанные на том, что вы объявляете класс (что анонимный класс), а затем также необходимо создать экземпляр этого класса:

  1. сделать производный класс (который анонимный класс всегда) абстрактную, это нормально для нормальных и внутренних классов, но это не возможно для анонимных классов, поэтому компилятор не должен предложить это в первую очередь
  2. реализовать все методы и не имеет абстрактные метод в вашем анонимном объявлении класса

Итак, чтобы решить вашу актуальную проблему: просто реализовать method() так что ваша декларация анонимного класса не содержит более абстрактные методы

abstract class Test{ 
    abstract void method(); 
} 
Test o = new Test() 
{ 
    void method() 
    { 
    // do something 
    }; 
}; 

Теперь все декларируется и компилятор не должен жаловаться больше.