是什么让Enum课程无法获得?

GOT*_*O 0 4 java inheritance

我一直在看这个Enum类的源代码.它看起来像一个带有受保护构造函数的普通抽象类.它不是最终的,它内部没有任何特殊的注释,也不使用本机代码.然而,它不能直接子类化.实际上,以下代码无法编译:

class Foo<E extends Enum<E>> extends Enum<E> {
    Foo(String name, int ordinal) {
        super(name, ordinal);
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这Enum是Java中的一个特殊类,我知道有很好的理由可以禁止直接子类化.但从技术上讲,你如何强制执行这种行为?程序员是否可以创建一个类似的非final类,尽管有一个可访问的构造函数,但它不允许直接子类化?

Jon*_*eet 6

Enum直接在语言中扩展是无效.每当你声明一个时enum,它确实会创建一个子类Enum.

JLS阻止您"手动"声明扩展的类的Enum方式只是明确地禁止它.从JLS第8.1.4节:

如果ClassType命名类Enum或对其进行任何调用,则为编译时错误.

(ClassType你要扩展的类型在哪里.)

没有这个规则,你的代码就完全有效了.