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

  • 本文关键字:枚举 技术 是什么 java enums
  • 更新时间 :
  • 英文 :


给定以下enum:

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

相关内容

  • 没有找到相关文章

最新更新