Почему все анонимные классы неявно являются окончательными?

Согласно JLS:

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

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

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

Если я выберу такой класс:

SomeType foo = new SomeType() {
    @Override
    void foo() {
        super.foo();
        System.out.println("Hello, world!");
    }
};

Почему мне не разрешено создавать подклассы снова, если я так хочу?

SomeType foo = new SomeType() {
    @Override
    void foo() {
        super.foo();
        System.out.println("Hello, world!");
    }
} {
    @Override
    void foo() {
        System.out.println("Hahaha, no super foo for you!");
    }
};

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

6
задан corsiKa 21 December 2011 в 01:17
поделиться