Ответ 1
Два практических отличия (в отличие от причин, связанных с языком), которые приходят на ум:
- Если вы объявите
state
какEnum<Thread.State>
, вы не сможете передать его любым методам, ожидающим aThread.State
. - Если вы объявите
state
какEnum<Thread.State>
, вы оставите читатель — кому нужно прикоснуться к этому коду в будущем -— интересно, почему вы написали это таким образом.
Ни одна из них не является ужасно глубокой причиной; мы могли легко представить параллельную вселенную, где большинство людей использовали 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>
, то вы не можете использовать его в качестве ключа в карте перечисления.)