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

问题描述 投票:-4回答:3

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

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

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

java
3个回答
1
投票

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

不,不是。

enumE的直接超类是Enum<E>(§8.1.4)。” JLS 8.9

然而,这并没有使Enum成为enum类。

另请注意,你不能extendEnum

*“如果ClassType命名类Enum或任何Enum(§8.9)的调用,那么这是一个编译时错误。”* JLS 8.1.4

由于Enumabstract,你不能直接实例化该类,或者除了声明enum类型之外还要创建一个“枚举类”。简而言之,Enum有点特殊,而且直接使用有限。


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


1
投票

你不能这样做。参考:

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

所有枚举类型都隐式扩展了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?");
    }

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.