Dlaczego mogę anonimowo podklasy enum, ale nie klasy końcowej?
Ten kod:
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);
}
}
wydruki:
Jestem wartością
Jednak ten kod:
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";
}
});
}
}
powoduje błąd kompilacji:
cannot inherit from final HelloWorld.C
Dlaczego możeE.VALUE
stwórz coś, co wydaje mi się anonimoweE
podklasa, przesłaniającatoString
metoda, podczas gdy użycie ostatniej klasy zamiast niejawnie końcowego wyliczenia powoduje błąd kompilacji?
Dokładniej, dlaczegoVALUE
przesłonić wszystkoE
? Miałem wrażenie, że kod
public enum E {
VALUE;
}
był z grubsza równoważny
public static final class E {
public static final E VALUE = new E();
}
w takim przypadku anonimowy charakter nie byłby dozwolony.
Co za różnica? Dlaczego są wyjątkowe?