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")
然后你将这个声明为 Object
的 Short
对象传递给 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")
在我的项目中,我有一个像这样的枚举:
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")
然后你将这个声明为 Object
的 Short
对象传递给 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")