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

如果Enum声明没有递归部分,Java中会有什么不同

郑狐若
2023-03-14
问题内容

请参阅 Java Enum定义 和 [为什么在Java中将枚举声明为Enum <E扩展Enum <E

](http://codingdict.com/questions/131394)
进行一般性讨论。在这里,我想了解如果将Enum类定义为以下内容,则会被完全破坏(不再是类型安全的,或者需要其他强制转换等)

public class Enum<E extends Enum>

我正在使用以下代码测试我的想法:

interface MyComparable<T> {
    int myCompare(T o);
}

class MyEnum<E extends MyEnum> implements MyComparable<E> {
    public int myCompare(E o) { return -1; }
}

class FirstEnum extends MyEnum<FirstEnum> {}

class SecondEnum extends MyEnum<SecondEnum> {}

有了它,我无法在这种确切的情况下找到任何好处。

PS。我不允许这样做的事实

class ThirdEnum extends MyEnum<SecondEnum> {}

当使用递归定义MyEnum时
a)不相关,因为使用真正的枚举不被允许这样做,只是因为您不能自己扩展枚举
b)不正确-请在编译器中尝试一下,看看实际上是能够编译没有任何错误

PPS。我越来越倾向于认为,正确的答案是“如果删除递归部分,什么也不会改变”-但我简直不敢相信。


问题答案:

我相信这样做的一个令人信服的理由是,它使MyEnum类中的代码更具类型安全性。

考虑到递归部分使这种事情成为可能:

class MyEnum<E extends MyEnum<E>> {
    private Thing<E> util1() { return someObject }
    private void util2(E e) {}
    public int method(E o) { 
        Thing<E> thingy = o.util1(); 
        // You can call the util1 method on o and get a type safe return element.
        E o1 = // I don't care how you get a parametrized E object.
        o.util2(o1);
        // You can call the util2 method with a typesafe parameter.
    }
}

简而言之,该递归使您可以将类型安全方法放在可以在任何E元素上调用的Enum类中,这些调用将是类型安全的。



 类似资料:
  • 问题内容: 如果语言设计者仅使用Enum 会对语言产生怎样的影响? 现在唯一的区别是有人会写 A扩展 但由于Java中不允许扩展枚举,因此仍然是非法的。我也在考虑为jvm提供一个字节码,该字节码将smth定义为扩展枚举-但是泛型不会受到影响,因为它们都被删除了。 那么,声明的重点是什么? 谢谢! 编辑 为简单起见,让我们来看一个例子: 这个类结构有什么问题?限制可以做什么? 问题答案: 这是一个普

  • 问题内容: 以下方法不起作用,因为内部块声明的变量与外部块中的变量同名。显然,变量属于声明它们的方法或类,而不属于声明它们的块,因此,我无法编写一个简短的临时临时块进行调试,而恰好将外部作用域中的变量压入阴影只是片刻: 我使用过的几乎每种块范围语言都支持此功能,包括我在学校为解释器和编译器编写的琐碎小语言。Perl可以做到这一点,Scheme甚至C都可以做到。甚至PL / SQL也支持这一点! J

  • 递归 enum 递归枚举是拥有另一个枚举作为枚举成员关联值的枚举. 当编译器操作递归枚举时必须插入间接寻址层. 你可以在声明枚举成员之前使用indirect关键字来明确它是递归的. e.g. 表达式(5+4)*2 indirect enum ArithmeticExpression { case number(Int) case addition(ArithmeticExpress

  • 问题内容: 我要选择不是特定类后代的跨度,我们称其为“否”。这是我的CSS: 这是HTML 两个问题: 为什么我的CSS同时适用于是1和否2? 如果切换到通用选择器,为什么整个过程都会中断? 问题答案: 元素的两个父元素都不具有class ,无论其他祖先是否都具有class :

  • 我试图表示一个树状递归数据结构,其中每个节点可能是两种不同数据类型中的一种。我使用boost变体来“容纳”可能出现在每个节点上的两种类型。 但是,我遇到了一个问题。我严格使用“using”指令声明所有这些类型,因此当我到达节点的递归性质时,它会失败,因为typedef/using可能不会使用递归。 如何做到这一点? 我已经探索过使用boost::make_recursive_variant,但它创

  • 本文向大家介绍render函数中return如果没有使用()会有什么问题?相关面试题,主要包含被问及render函数中return如果没有使用()会有什么问题?时的应答技巧和注意事项,需要的朋友参考一下 我们在使用JSX语法书写react代码时,babel会将JSX语法编译成js,同时会在每行自动添加分号(;),如果后换行了,那么就会变成 一般情况下会报错: Nothing was returne