java.lang.ClassCastException: java.lang.Short 无法转换为 java.lang.Integer

java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.Integer

在我的项目中,我有一个像这样的枚举:

public enum MyEnum {

FIRST(1),

SECOND(2);

private int value;

private MyEnum(int value) {
    this.value = value;
}

public int getValue() {
    return value;
}

public static MyEnum fromValue(int value) {
    for (MyEnum e : MyEnum.values()) {
        if (e.getValue() == value) {
            return e;
        }
    }
    return null;
}

我有这个代码:

Map<String, Object> myMap = new HashMap<>();
// Fill my Map with data from database
myMap = namedParameterJdbcTemplate.queryForList(qry, paramsMap);

***if (Arrays.asList(MyEnum.values())
                .contains(MyEnum.fromValue((int) 
                myMap.get("myKey")) )))*** {
    // Do something
    }

我得到异常

 java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.Integer** on this line : **if (Arrays.asList(MyEnum.values())
            .contains(MyEnum.fromValue((int)myMap.get("myKey")) )))

myMap 填充了来自数据库的数据,知道它是一个 SQL 服务器数据库并且 [=从数据库返回的31=]myKey在数据库中是tinyint类型。

你能告诉我我做错了什么吗? 谢谢。

此致。

这里:

(int)myMap.get("myKey")

我猜想 get 方法 return引用了一个 Short 对象,它不能转换为 Integer,因为 short 不是从 Integer 继承的。

您可以做的是转换为 Short,然后调用 intValue method,如下所示:

((Short)myMap.get("myKey")).intValue()

这将return一个整数值

java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.Integer

此处 myMap.get("myKey") returns 一个 Short 实例,但返回的声明对象是 Object 因为映射被声明为 Map<String, Object>.

就好像你写了:

Object myValue = myMap.get("myKey")

然后你将这个声明为 ObjectShort 对象传递给 MyEnum.fromValue(),它有一个 int.

作为参数
MyEnum.fromValue((int)myValue));

编译器试图将对象转换为 Integer
但它不是 Integer 而是 Short.
所以转换失败。

要解决您的问题,您应该首先检查对象的实例。
如果对象不是 Short 的实例,则应抛出异常或忽略该值。
如果是,您应该从 Object 转换为 Short 并将此 Short 传递给 fromValue() ,它将自动拆箱到 short :

   Object myValue =  myMap.get("myKey");
   if (!(myValue instanceof Short)){          
      throw new YourRuntimeException("A Short is expected but get a " + myValue.getClass());
      // or ignore the value
   }

   if (Arrays.asList(MyEnum.values())
              .contains(MyEnum.fromValue(((short) myValue)) {
           ....
    }

试试这个。

(int)(short)myMap.get("myKey")