Java Enum <t> vs T作为变量类型

时间:2017-02-25 11:39:36

标签: java generics enums difference

此声明之间是否有任何区别

Thread.State state = Thread.State.NEW;

那个

Enum<Thread.State> state = Thread.State.NEW;
在Java中

?而不是第二个选项有点长?

3 个答案:

答案 0 :(得分:14)

与比较之间的情况相同:

Child o = someChild;

Parent o = someChild;

Enum是所有枚举类型的父类。因此,对于第二行,代码不能包含对Thread.State的特定成员的引用,特别是this section of the language spec中描述的成员。

答案 1 :(得分:8)

  

有什么不同......

在实践中,在这种特殊情况下,可能没有。

理论上,Thread.StateEnum<Thread.State>的子类型。如果Thread.State声明(非私有)字段或方法,则可以通过state的第一个声明使用它们,但不能使用第二个声明。

一般来说,第一种形式更可取......因此。

此外,我认为您无法通过第二个声明中声明的变量看到枚举的static方法values()valueOf; e.g。

state.valueOf("BLOCKED")

但是,通过实例引用调用静态方法是错误的样式。

答案 2 :(得分:3)

浮现在脑海中的两个实际差异(与语言律师相反):

  1. 如果您将state声明为Enum<Thread.State>,那么您将无法将其传递给任何期望Thread.State的方法。
  2. 如果您将state声明为Enum<Thread.State>,那么您将离开读者 - 将来需要触摸此代码的人 - 想知道为什么你这样编写它。
  3. 这些都不是一个非常深刻的原因;我们很容易想象一个平行的宇宙,其中大多数人使用Enum<Thread.State>而不是Thread.State,就像(在我们的宇宙中)大多数人使用List<...>而不是ArrayList<...>(如果可能的话) 。但是,由于大多数人在我们的宇宙中这样做,所以最好只遵循常见模式,以尽量减少混淆和意外不兼容的风险。

    顺便提一下,如果这是你的下一个问题。 。 。 使用Enum的主要情况是,当您想要编写适用于许多不同枚举类型的通用内容时。 JDK中的一个示例是EnumMap<K extends Enum<K>,V>,它是一种特殊的地图实现,通过知道其键是枚举值来获得空间和性能优势。

    (顺便提一下,你无法EnumMap<Enum<Thread.State>, String>,因为Enum<Thread.State>不会延伸Enum<Enum<Thread.State>>。相反,你必须EnumMap<Thread.State, String>。所以这是我上面提到的差异#1的示例:如果您将state声明为Enum<Thread.State>,那么您就不能将其用作枚举图中的一个键。)