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

时间:2017-07-26 10:25:03

标签: java sql-server casting integer short

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

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

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

问候。

3 个答案:

答案 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")