不兼容的类型。找到:“ java.lang.Enum”,必需:“ char,byte,short,int,Character,Byte,Short,Integer,String或enum”

时间:2019-02-19 11:39:36

标签: java

我认为java.lang.Enum是一个枚举,但不是吗?

void test(Enum e) {
 switch (e) {
  case A: ...
 }
}
  

不兼容的类型。找到:“ java.lang.Enum”,必需:“ char,byte,   short,int,Character,Byte,Short,Integer,String或枚举'

3 个答案:

答案 0 :(得分:1)

您不能那样做。请参阅:

  

JLS§14.11开关语句“ [开关的类型]表达式   必须为char,byte,short,int,Character,Byte,Short,Integer,   字符串,或枚举类型(第8.9节),或发生编译时错误。”

所有 enum 类型都隐式扩展 java.lang.Enum ,但是 enum 是一种特殊的引用类型,它不是一个类本身,但更像是从同一基类Enum扩展的一类类。关键字“枚举”声明的任何类型本身就是不同类。

进行此工作的正确方法是先分别创建您的枚举,例如

enum Day
{
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY 
}

然后将枚举作为此类参数提供给您的方法:

public static void printTodaysThought(Day theDay)

并像下面这样在switch语句中使用:

switch (theDay)
    {
      case MONDAY:
      case TUESDAY:
      case WEDNESDAY:
      case THURSDAY:  System.out.println("THURSDAY");
                      break;

      case FRIDAY:    System.out.println("FRIDAY");
                      break;

      case SATURDAY:
      case SUNDAY:    System.out.println("SUNDAY");
                      break;

      default:        System.out.println("What day is it?");
    }

答案 1 :(得分:1)

  

我认为java.lang.Enumenum,但不是吗?

不,不是。

  

enum类型E的直接超类是Enum<E>(第8.1.4节)。” JLS 8.9

但是,这并不使Enum成为enum类。

请注意,您不能extendEnum

  

*“如果 ClassType 命名类Enum或对Enum的任何调用(第8.9节),则是编译时错误。” * {{3} }。

并且由于Enumabstract,所以除了声明enum类型之外,您不能直接实例化该类或创建“枚举类”。简而言之,Enum有点特殊,并且直接使用受到限制。


我希望您在switch语句中遇到此编译错误。涉及枚举的switch语句需要特定的enum类...以及在切换案例中将要使用的特定的一组枚举常量。类Enum<E>不在声明常量的位置。 (因此从语言的角度来看这是行不通的。)

答案 2 :(得分:0)

    enum CarType{
    HATCHBACK,SEDAN,SUV
    }

要检查基于枚举的

    CarType cartype;

    switch(cartype){
    case HATCHBACK:
     dosomethingfor hatchback;
     break;
    case SEDAN:
     dosomethingfor sedan;
     break;
    case SUV:
     dosomethingfor suv;
     break;
  default:
     do something default;
}