Почему я могу анонимно создать подкласс enum, но не последний класс?
Этот код:
public class Sandbox {
public enum E {
VALUE {
@Override
public String toString() {
return "I'm the value";
}
};
@Override
public String toString() {
return "I'm the enum";
}
}
public static void main(String[] args) {
System.out.println(E.VALUE);
}
}
печатает: I»
м значение
Тем не менее, этот код:
public class Sandbox {
public static final class C {
@Override
public String toString() {
return "I'm a C";
}
}
public static void main(String[] args) {
System.out.println(new C() {
@Override
public String toString() {
return "I'm anonymous";
}
});
}
}
приводит к ошибке компиляции:
cannot inherit from final HelloWorld.C
Почему можетE.VALUE
создать то, что мне кажется анонимнымE
подкласс, переопределяяtoString
метод, при использовании финального класса вместо неявно финального перечисления выдает ошибку времени компиляции?
Более конкретно, почему можноVALUE
переопределить что-либо вE
? У меня сложилось впечатление, что код
public enum E {
VALUE;
}
был примерно эквивалентен
public static final class E {
public static final E VALUE = new E();
}
в этом случае анонимный характер не будет разрешен.
Какие'Разница? Почему перечисления особенные?