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

Java枚举定义

伍昱
2023-03-14
问题内容

我以为我很了解Java泛型,但是随后在java.lang.Enum中遇到了以下内容:

class Enum<E extends Enum<E>>

有人可以解释如何解释此类型参数吗?奖励点,用于提供可以使用类似类型参数的其他示例。


问题答案:

这意味着枚举的类型参数必须从本身具有相同类型参数的枚举派生。怎么会这样 通过使类型参数成为新类型本身。因此,如果我有一个名为StatusCode的枚举,则它等效于:

public class StatusCode extends Enum<StatusCode>

现在,如果你检查的限制,我们已经得到了Enum<StatusCode>-如此E=StatusCode。让我们检查一下:是否E扩展Enum<StatusCode>?是! 没关系

你可能会问自己这是什么意思:)好吧,这意味着Enum的API可以引用自身-例如,可以说Enum 实现 Comparable<E>。基类能够进行比较(在枚举的情况下),但可以确保仅将正确种类的枚举相互比较。(编辑:嗯,差不多-请参阅底部的编辑。)

我在ProtocolBuffers的C#端口中使用了类似的东西。有“消息”(不可变)和“构建器”(可变,用于构建消息)-它们成对出现。涉及的接口有:

public interface IBuilder<TMessage, TBuilder>
  where TMessage : IMessage<TMessage, TBuilder> 
  where TBuilder : IBuilder<TMessage, TBuilder>

public interface IMessage<TMessage, TBuilder>
  where TMessage : IMessage<TMessage, TBuilder> 
  where TBuilder : IBuilder<TMessage, TBuilder>

这意味着从消息中可以获取适当的构建器(例如,复制消息并更改一些位),而从构建器中获取完成的消息则可以获取适当的消息。这是一项很好的工作,但是API的用户实际上并不需要关心这一点-它非常复杂,并且花了几遍迭代才能达到目的。

编辑:请注意,这不会阻止你创建使用类型参数的奇数类型,该类型参数本身还可以,但是不是同一类型。目的是在正确的情况下提供好处,而不是保护你免受错误的情况的影响。

因此,如果Enum仍然没有在Java中进行“特殊”处理,则可以(如注释中所述)创建以下类型:

public class First extends Enum<First> {}
public class Second extends Enum<First> {}

Second会实施Comparable<First>而不是Comparable<Second>…但First本身会很​​好。



 类似资料:
  • 主要内容:声明枚举,枚举类,为枚举添加方法,EnumMap 与 EnumSet枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。 在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代。而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。 声明枚举 声明枚举时必须使用 enu

  • 问题内容: 我想要一个Java枚举,其值是整数。 例如: 但是我也想要这两个常量的自定义名称, 例如“ Task Created”和“ Task Deleted”(那里有空格)。 我想尽可能优雅地做到这一点,而无需编写 太多额外的代码。 我可以在没有其他 将枚举常量映射到其自定义名称的映射的情况下实现此目标吗? 我在该项目中使用JDK 6。 问题答案: 只需为此添加一个字段: 如果您不想指定字符串

  • 在不使用其他映射( 将枚举常量映射到它们的自定义名称)的情况下,我能做到这一点吗? 我在这个项目中使用JDK6。

  • 让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。 任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能

  • 为什么要在C++11中编译: 但这不是:

  • 问题内容: 我有一个枚举的类对象(我有一个),我需要获取此枚举表示的枚举值的列表。该静态函数有我需要什么,但我不知道怎么去从类对象访问它。 问题答案: