我想知道为什么在Java语言中a class
不能扩展enum
。
我不是在谈论一个enum
延伸的enum
(这不能做,因为Java没有多重继承,而enum
Š隐含延长java.lang.Enum
),但一类extends
的enum
以只添加额外的方法,而不是额外的枚举值。
就像是:
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