【问题标题】:java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.Integerjava.lang.ClassCastException:java.lang.Short 不能转换为 java.lang.Integer
【发布时间】:2018-01-01 14:47:17
【问题描述】:

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

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

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

问候。

【问题讨论】:

  • 顺便说一下,EnumSet.allOf(MyEnum.class) 比 Arrays.asList(MyEnum.values()) 更有效(也更容易阅读)。请参阅the documentation 了解更多信息。
  • 感谢您的评论,我会尝试的!

标签: java sql-server casting integer short


【解决方案1】:

这里:

(int)myMap.get("myKey")

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

你可以做的是转换为 Short,然后调用 intValue method,像这样:

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

这将返回一个整数值

【讨论】:

  • 谢谢,它成功了。但我必须选择最干净的解决方案
  • 谢谢!这是我案例中最好的解决方案。
【解决方案2】:

java.lang.ClassCastException: java.lang.Short 不能转换为 java.lang.Integer

这里myMap.get("myKey") 返回一个Short 实例,但返回的声明对象是Object,因为映射声明为Map&lt;String, Object&gt;

好像你写过:

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)) {
           ....
    }

【讨论】:

  • 谢谢它有效。但是,我编写了这部分有效的代码: Short i = new Short((short) 1); int j = (int) i; System.out.println(i); .这是同样的事情,它适用于这种情况,你能告诉我为什么吗?我只是想理解。提前谢谢你。
  • 原因很简单。这里int j = (int) i; 编译器将i 值从Short 拆箱到short,然后进行从shortint 的扩大转换。此外,演员阵容对于扩大转换是无用的。 int j = i; 就够了。仅在缩小转换时需要。在您的实际代码中,Short 实例被声明为Object。因此编译器不会尝试将其拆箱,而是直接对目标强制转换进行强制转换。我进行了编辑以解释它并提供更有效的解决方案。
  • 非常感谢,我现在明白了。
【解决方案3】:

试试这个。

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

【讨论】:

    猜你喜欢
    • 2012-03-19
    • 2014-08-29
    • 2012-05-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多