直接枚举与枚举<> .. 确切的技术区别是什么?
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;
在 letter1
和 letter2
上调用 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;}
| ^--^
在这两种情况下,编译器无法证明(在运行前)Number
或 Enum<Letter>
是它可以打开的东西,所以它不会让你这样做。
给定以下枚举:
public enum Letter {
Alpha, Beta, Gamma, Delta;
}
那么下面两个都编译无误:
Letter letter1 = Letter.Alpha;
Enum<Letter> letter2 = Letter.Beta;
在 letter1
和 letter2
上调用 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;}
| ^--^
在这两种情况下,编译器无法证明(在运行前)Number
或 Enum<Letter>
是它可以打开的东西,所以它不会让你这样做。