给定以下enum:
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>
是它可以打开的,所以它不会让你这样做。