在我的项目中,我有一个这样的枚举:
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 Server数据库,并且 myKey 从数据库返回的数据库中的类型为 tinyint 。
你能告诉我我做错了什么吗? 感谢。问候。
答案 0 :(得分:1)
这里:
(int)myMap.get("myKey")
我猜get方法返回对Short对象的引用,该对象无法转换为Integer,因为short不会从Integer继承。
你可以做的是施放到Short,然后调用intValue method,就像这样:
((Short)myMap.get("myKey")).intValue()
将返回一个整数值
答案 1 :(得分:0)
java.lang.ClassCastException:java.lang.Short无法强制转换为 java.lang.Integer中
此处myMap.get("myKey")
返回Short
个实例,但返回的声明对象为Object
,因为地图已声明为Map<String, Object>
。
就像你写的那样:
Object myValue = myMap.get("myKey")
然后,将此Short
对象声明为Object
传递给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)) {
....
}
:
#include <iostream>
enum class CType
{
Letter,
Digit,
Symbol
};
CType getType(char a)
{
if( (a >= 65 && a <= 90) || (a >= 97 && a <= 122) )
return CType::Letter;
if( a >= 48 && a <= 57 )
return CType::Digit;
return CType::Symbol;
}
CType getType2(char a) // more explicit
{
if( (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z') )
return CType::Letter;
if( a >= '0' && a <= '9' )
return CType::Digit;
return CType::Symbol;
}
#include <cctype>
CType getType3(char a) // warning: that functions uses locale inside
{
if( isalpha(a) )
return CType::Letter;
if( isdigit(a) )
return CType::Digit;
return CType::Symbol;
}
int main(...)
{
char a;
std::cout << "Enter a single character: " ;
std::cin >> a;
switch(getType(a)) {
case CType::Letter:
std::cout << "You entered a letter!";
break;
case CType::Digit:
std::cout << "You entered a number!";
break;
case CType::Symbol:
std::cout << "You entered a symbol!";
break;
}
return 0;
}
答案 2 :(得分:0)
试试这个。
(int)(short)myMap.get("myKey")