Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以扩展Java枚举?_Java_Enums - Fatal编程技术网

是否可以扩展Java枚举?

是否可以扩展Java枚举?,java,enums,Java,Enums,这是我想要完成的,我有一个类,它有一些值的枚举,我想对它进行子类化,并向枚举中添加更多的值。这是一个坏例子,但: public class Digits { public enum Digit { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } } public class HexDigits extends Digits { public enum Digit { A, B, C, D, E, F } } 所以十六进制数字。数字包含所有十六进制数字。那可能

这是我想要完成的,我有一个类,它有一些值的枚举,我想对它进行子类化,并向枚举中添加更多的值。这是一个坏例子,但:

public class Digits
{
 public enum Digit
 {
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9
 }
}

public class HexDigits extends Digits
{
 public enum Digit
 {
  A, B, C, D, E, F
 }
}

所以十六进制数字。数字包含所有十六进制数字。那可能吗?

不可能。您所能做的最好是实现两个枚举和接口,然后使用该接口而不是枚举。因此:

interface Digit {
  int getValue();
}

enum Decimal implements Digit {
  ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE;

  private final int value;

  Decimal() {
    value = ordinal();
  }

  @Override
  public int getValue() {
    return value;
  }
}

enum Hex implements Digit {
  A, B, C, D, E, F;

  private final int value;

  Hex() {
    value = 10 + ordinal();
  }

  @Override
  public int getValue() {
    return value;
  }
}
没有

枚举不能被子类化

这里的理由是枚举定义了固定数量的值。
子类化会破坏这一点。

不,你不能。如果查看枚举的定义,它的实例是最终的,不能扩展。如果您将枚举理解为一组有限的最终值,那么这是有意义的

数字(一种句法工件)可以是二进制、十进制、十六进制或任何形式,与实际的语义数字(在上下文(基本系统)中由数字在语法上表示的数字实体)之间存在差异

在您的示例中,您需要的是

  • 指定同步数字的枚举 (十进制数字和字母) 代表法律的符号 十六进制;即枚举标记, 及
  • 指定行为的类(或 语法)语法上是必需的 用数字表示数字 (使用数字[句法] 枚举)
也就是说,您有标记或符号以及语法/行为,用于指示标记流是否表示给定基数下的数字

但这有点偏离正切(正如您所说,这只是一个示例)

…您不能,也不应该。枚举并不表示可以扩展的内容。它们用于表示常量一组常量值。有些内容是不可继承的

此外,不要落入为扩展而扩展的陷阱,也不要试图在代码或模型中强制使用结构


将一组值作为另一组值的扩展似乎是有意义的。通常情况下,它不是。使用继承来重用行为或复杂结构,而不仅仅是那些几乎没有结构且与之关联的不可重用行为的数据。

这是不可能的。这是有原因的。想象一下,您可以扩展一个枚举:

enum A { ONE, TWO }
enum B extends A { THREE }  // for a total { ONE, TWO, THREE }
现在您可以执行以下操作:

B b = B.THREE
A a = b  // a = B.THREE ?
但是
B.THREE
不是
a
的有效选项


当然,您可以使它们不具有多态性,但这样就不会真正扩展。

答案是“否”(有关详细信息,请参阅下面的答案).Josh Bloch的书《有效Java》对此有很好的解释和解决方法。我确实尝试过,这就是我在这里发布的原因!所有枚举都隐式扩展Java.lang.Enum。由于Java不支持多重继承,枚举不能扩展任何其他内容。@Narayan出现了一个小的编译器错误(现已修复)但它在其他方面是有效的。@cletus为什么你在
enum
中使用构造函数?它可能没有初始化。如何在项目中使用此代码?你能提供一些例子吗?+1非常简洁地解释为什么它不起作用-它违反了可替换性原则,即,在任何情况下你都应该能够使用子类型的任何实例其中需要超类型的实例