当前位置: 首页 > 面试题库 >

是什么使Enum类不可继承?

严宏朗
2023-03-14
问题内容

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

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

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


问题答案:

Enum直接 在语言中 扩展只是无效 。声明内的任何时间enum,那 确实 创造的一个子类Enum

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

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

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

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



 类似资料:
  • 问题内容: 在本文中, Nick Coghlan讨论了PEP 435类型的 一些设计决策,以及如何将其子类化以提供不同的体验。 但是,我给出的建议(我是stdlib的主要作者)关于使用元类的建议是,在没有充分好的理由的情况下不应该这样做- 例如,无法使用类装饰器或专用工具来完成所需的工作隐藏任何丑陋的功能;而在我自己的工作,我已经能够做到我需要什么简单的使用,在创建时,和/或正常类/实例方法类:

  • 本文向大家介绍什么是MySQL ENUM数据类型?使用ENUM数据类型有什么优势?,包括了什么是MySQL ENUM数据类型?使用ENUM数据类型有什么优势?的使用技巧和注意事项,需要的朋友参考一下 与标准数据类型不同,ENUM数据类型是1到65,535个字符串的枚举列表,指示字段的允许值。定义ENUM时,您将创建一个项目列表,必须从中选择该值(或者可以为NULL)。 例如,如果希望字段包含“ A

  • 本文向大家介绍MySQL ENUM数据类型的不同属性是什么?,包括了MySQL ENUM数据类型的不同属性是什么?的使用技巧和注意事项,需要的朋友参考一下 可以使用以下影响允许值的属性来定义MySQL ENUM类型- NOT NULL-  在ENUM类型中,默认情况下允许NULL值。要禁止NULL值,我们需要在描述ENUM列时使用NOT NULL属性。 NULL  -NULL属性是DEFAULT

  • 问题内容: 在.NET Framework 的参考中,使用type 声明请求类型。 在RFC 2616 中,声明了所有HTTP请求方法(例如POST,GET,PUT,DELETE …)。 .NET 和类中也存在类似的行为。 Java在方法上有类似的方法。 这些语言设计者为什么不考虑为这些HTTP方法实现枚举? 你有好主意吗? 问题答案: RFC 2616 链接的第一句话(添加了重点): HTTP

  • 问题内容: 在Python 3.4中,我们在标准库中获得了一个Enum库:。我们可以在pypi中使用enum34的Python 2.4到2.7(甚至3.1到3.3)使用它的反向端口。 但是我们已经设法在没有这个新模块的情况下相处了很长时间-那么为什么现在有了它呢? 我对其他语言的枚举的用途有一个大致的了解。在Python中,通常使用如下所示的裸类并将其称为枚举: 可以在API中使用它来创建值的规范

  • 本文向大家介绍MySQL ENUM的局限性是什么?,包括了MySQL ENUM的局限性是什么?的使用技巧和注意事项,需要的朋友参考一下 以下是MySQL ENUM的限制- 枚举值不能是表达式 我们甚至不能将表达式用作枚举成员,即使将其计算为字符串值也是如此。 示例 例如,我们甚至可以使用CONCAT函数来导致字符串的求值。 以下查询将不起作用- 无法将用户变量用作枚举成员 另一个限制是我们不能将用