这意味着枚举的类型参数必须从枚举中派生,枚举本身具有相同的类型参数。这怎么可能发生?通过使类型参数为新类型本身。因此,如果我有一个名为StatusCode的枚举,它将等效于:
public class StatusCode extends Enum
现在,如果你检查约束,我们得到Enum< StatusCode> – 所以E = StatusCode。让我们检查:E扩展Enum< StatusCode> ;?是!我们没关系。 你可能会问自己这是什么的意思:)好吧,这意味着Enum的API可以引用自身 – 例如,能够说Enum< E>实现可比较的< E> ;.基类能够做比较(在枚举的情况下),但它可以确保它只比较正确的枚举类型彼此。 (编辑:嗯,差不多 - 见底部的编辑。) 我使用类似的东西在我的C#端口ProtocolBuffers。有“消息”(不可变的)和“构建器”(可变,用于构建消息) – 并且它们成对类型。涉及的接口是:
public interface IBuilder
where TMessage : IMessage
where TBuilder : IBuilder
public interface IMessage
where TMessage : IMessage
where TBuilder : IBuilder
这意味着,您可以从消息中获取适当的构建器(例如,获取消息副本并更改某些位),并从构建器中获取适当的消息。这是一个很好的工作API的用户不需要真正关心这 – 虽然 – 它是可怕的复杂,并采取了几个迭代,以达到它的地方。
编辑:请注意,这并不会阻止你创建奇怪的类型,使用本身是好的类型参数,但是不是相同的类型。目的是在正确的情况下给予好处,而不是保护你免受错误的情况。
因此,如果Enum在Java中没有被“特殊”处理,您可以(如注释中所述)创建以下类型:
public class First extends Enum {}
public class Second extends Enum {}
第二将实现可比较的而不是比较 …但第一本身将是罚款。