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

时间:2013-09-06 05:33:22

标签: java inheritance

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

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

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

1 个答案:

答案 0 :(得分:6)

仅在语言中直接扩展Enum无效。每当您声明enum时, 都会创建Enum的子类。

JLS阻止您“手动”声明扩展Enum的类的方式只是明确地禁止它。来自JLS section 8.1.4

  

如果ClassType将类命名为Enum或对其进行任何调用,那么这是一个编译时错误。

ClassType是您要扩展的类型。)

如果没有这条规则,您的代码就完全有效了。