4

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

class Foo<E extends Enum<E>> extends Enum<E> {
    Foo(String name, int ordinal) {
        super(name, ordinal);
    }
}

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

4

1 回答 1

6

只有Enum直接在语言内扩展是无效的。任何时候你声明一个enum,都会创建一个 的子类。Enum

JLS 阻止您“手动”声明扩展类Enum的方式只是明确禁止它。从JLS 第 8.1.4 节

如果 ClassType 命名类 Enum 或对它的任何调用,则这是一个编译时错误。

ClassType您要扩展的类型在哪里。)

如果没有该规则,您的代码将完全有效。

于 2013-09-06T05:44:55.380 回答