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

为什么类不能扩展枚举?

陶山
2023-03-14
问题内容

我想知道为什么在Java语言中a class不能扩展enum

我不是在谈论一个enum延伸的enum(这不能做,因为Java没有多重继承,而enumŠ隐含延长java.lang.Enum),但一类extendsenum以只添加额外的方法,而不是额外的枚举值。

就像是:

enum MyEnum
{
    ASD(5),
    QWE(3),
    ZXC(7);
    private int number;
    private asd(int number)
    {
        this.number=number;
    }
    public int myMethod()
    {
        return this.number;
    }
}

class MyClass extends MyEnum
{
    public int anotherMethod()
    {
        return this.myMethod()+1;
    }
}

要这样使用:

System.out.println(MyClass.ASD.anotherMethod());

因此,有人可以对此限制提供理由(或将我指向正确的JLS部分)吗?


问题答案:

我认为 他们这样做 的答案来自以下问题:

在您的示例中,如何实例化MyClass?用户永远不会(通过new MyEnum())显式实例化枚举。您必须执行类似的操作,MyClass.ASD但不确定如何运行。

基本上,我不知道您建议的添加内容将使用哪种语法。这可能就是为什么他们使他们进入决赛等…

编辑已添加

如果原始Enum的作者提前计划了(不太可能),并且您不担心线程安全过高,则可以执行以下操作:(顺便说一句,我可能会对任何在生产代码YMMV中实际执行过此操作的人大叫)

public enum ExtendibleEnum {

   FOO, BAR, ZXC;

   private Runnable anotherMethodRunme;  // exact Interface will vary, I picked an easy one
                           // this is what gets "injected" by your other class

   public void setAnotherMethodRunMe(Runnable r) {  // inject here
      anotherMethodRunme= r;
   }

   public void anotherMethod() {  // and this behavior gets changed
      anotherMethodRunme.run();
   }
}


 类似资料:
  • 为什么我不能这样做/是否有解决方法来实现这一点: 这两个编译错误是 > On

  • 问题内容: 这节课: 无法编译: 因为( 根据Java语言规范 Java SE 8 Edition 的 第 8.1.4节“超类和子类”)类将直接依赖于“本身”,因为类直接取决于“ [其] 或子句[…中提到的”的任何类型。 ]作为超类或超接口名称的完全限定形式的限定符。” 但是我真的不明白这里的动机。什么是有问题的依赖关系?是否只是为了与非语言环境保持一致(因此最终将以其自身的词汇包围实例)? 问题

  • 问题内容: 创建数组时,无法更改其大小;它是固定的。好的,看起来不错,我们可以创建一个新的更大的数组并逐个复制值,这有点慢。它的技术背景是什么? 问题答案: 这个问题没有提到语言,因此我将选择基于“ C”的数组作为答案。 数组被分配为单个内存块。增长数组是有问题的,因为正确执行此操作的唯一方法是在最后增长它。为了增加大小N,在数组的末尾必须在下一个分配的地址之前至少有N个空闲字节。 要支持这种类型

  • 问题内容: 事实并非如此,这让我感到惊讶。 我认为,如果这样声明,那将是很有意义的: 毕竟,是的集合,不是吗? 那么,为什么没有这样一个很好的实现呢? 感谢Cletus提供的最权威的答案,但是我仍然想知道为什么,如果你已经可以查看(通过),那么它不仅扩展了该接口。 如果a 是a ,则元素是什么?唯一合理的答案是“键值对” 确实会很棒! 但这提供了非常有限的(且不是特别有用的)Map抽象。 但是,如

  • 问题内容: 作为实验,我尝试扩展-array,如下所示: 在类本身中添加一些与排序,交换,子数组构建等有关的方法。但是我在编译时遇到了这个错误: 我很好奇:为什么Java不允许扩展数组? 问题答案: 扩展基本类型(例如a 或数组)会打开安全漏洞。如果Java允许您扩展数组,则采用数组的方法将变得不安全。这就是字符串为,而数组根本不能扩展的原因。 例如,您可以重写该方法,并返回不正确大小的数组。这有

  • 问题内容: 我以为Python信任程序员。 问题答案: 圭多对此的看法: 我昨晚想到了这一点,意识到根本不应该允许您继承bool!子类仅在具有实例时才有用,但是仅存在bool子类的实例将打破不变的事实,即True和False是bool的唯一实例!(C的子类的实例也是C的实例。)我认为重要的是不要提供后门来创建其他bool实例,因此我认为bool不应是子类的。 参考: http //mail.pyt