class StatusCode扩展Enum <statuscode>

时间:2015-10-07 06:19:44

标签: java generics inheritance enums

public abstract class Enum<E extends Enum<E>>
    implements Comparable<E>, Serializable


class StatusCode extends Enum<StatusCode>

在java中,每个枚举都是类Enum的子类。我想将Enum类继承到我的自定义类“StatusCode”中。我试过这样做,但编译器抛出错误。详情如下

The type StatusCode may not subclass Enum<StatusCode> explicitly
    - Bound mismatch: The type StatusCode is not a valid substitute for the bounded parameter <E extends 
     Enum<E>> of the type Enum<E>

如果我无法明确扩展Enum类,为什么不呢?这不是最终的类,是什么确保枚举类不能扩展?

3 个答案:

答案 0 :(得分:3)

错误消息说清楚:

  

类型StatusCode可能不会明确地继承Enum<StatusCode>

您需要做的只是创建enum类型:

enum StatusCode { ONE, TWO; }

拥有此enum,编译器会确保它扩展Enum<StatusCode>,您不必担心它。

您可以通过运行此测试代码段来验证这是否为真:

StatusCode statusCode = StatusCode.ONE;
System.out.println(statusCode instanceof Enum);

请注意,instanceof运算符不需要Enum的type-parameter,这是一个您可以通过查看this thread了解更多信息的主题。

答案 1 :(得分:0)

  

Enum是一个抽象类,它不是最终的。那么为什么我不允许扩展枚举类?

枚举是该语言的一部分,因此适用特殊规则。这在Java Language Specification 8.1.4

中明确排除
  

如果ClassType命名类Enum或任何Enum调用

,那么这是一个编译时错误

这条规则的存在至关重要,否则你可以这样做:

public class EnumButNotAnEnum extends Enum<EnumButNotAnEnum> {

    @Override
    public EnumButNotAnEnum(String name, int ordinal) {
        super(name, ordinal);
    }

    // etc
}

换句话说,您可以创建可能具有无限实例的Enum子类。

答案 2 :(得分:0)

我在Java语言规范中找不到确切的定义。然而,我能找到的是§8.9中的这句话(也许它不是直接在里面写的):

The final clone method in Enum ensures that enum constants can never be
cloned, and the special treatment by the serialization mechanism ensures that
duplicate instances are never created as a result of deserialization. 
Reflective instantiation of enum types is prohibited. Together, these four 
things ensure that no instances of an enum type exist beyond those defined by 
the enum constants.

如果您可以通过简单地扩展Enum-class来定义枚举,则会违反此声明。 所以回答你的问题只是编译器禁止扩展枚举。