直接枚举与枚举<> .. 确切的技术区别是什么?

Direct enum vs Enum<> .. What is the exact technical difference?

给定以下枚举:

public enum Letter {
    Alpha, Beta, Gamma, Delta;
}

那么下面两个都编译无误:

Letter       letter1 = Letter.Alpha;
Enum<Letter> letter2 = Letter.Beta;

letter1letter2 上调用 getClass()name()ordinal() 显示相同的结果。

但是!以下将编译:

switch( letter1 ) {
case Alpha:
case Beta:
}

虽然这不会:

switch( letter2 ) {
case Alpha:
case Beta:
}

如果有的话,这两个变量之间的确切技术差异是什么?

Letter 之于 Enum<Letter> 就像 Integer 之于 Number。超类的子类。唯一的区别是 Enum<> 是与特定语言功能相关的特权超类。 (参见 java.lang.Record 了解另一个这样的特权超类。)

如果我们有这两个变量:

Integer n1 = 1;
Number  n2 = 2;

...那么这有效:

jshell> switch(n1) { case 1: System.out.println("one"); break; default: System.out.println("not one"); break;}
one

...但这不是:

jshell> switch(n2) { case 1: System.out.println("one"); break; default: System.out.println("not one"); break;}
|  Error:
|  incompatible types: java.lang.Number cannot be converted to int
|  switch(n2) { case 1: System.out.println("one"); break; default: System.out.println("not one"); break;}
|        ^--^

在这两种情况下,编译器无法证明(在运行前)NumberEnum<Letter> 是它可以打开的东西,所以它不会让你这样做。