当前位置: 首页 > 知识库问答 >
问题:

使用“cast”方法将整数转换为int时自动装箱/取消装箱

姬昀
2023-03-14

这里有一个非常简单的案例:我正在尝试将一个对象类型强制转换为一个基元,如下所示:

Object object = Integer.valueOf(1234);

int result1 = int.class.cast(object); //throws ClassCastException: Cannot convert java.lang.integer to int

int result2 = (int)object; //works fine

这是类'class'的cast方法的源代码

public T cast(Object obj) {
    if (obj != null && !isInstance(obj))
        throw new ClassCastException(cannotCastMsg(obj));
    return (T) obj;
}

private String cannotCastMsg(Object obj) {
    return "Cannot cast " + obj.getClass().getName() + " to " + getName();
}

为什么会出现这种情况?其他原语也发生了同样的情况。

活生生的例子

共有1个答案

西门品
2023-03-14

由于Java中的泛型,cast不能返回实际基元类型的值,因此不能很好地处理基元。所以它最终还是会再次拳击。如果您没有直接赋值int值,那么由于这个原因,它也必须装箱。

所以基本上,如果要转换为int,直接强制转换即可。

IsInstance被记录为始终为基元返回false:

如果此class对象表示基元类型,则此方法返回false

...cast可能也应该。

 类似资料:
  • 请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类维护了到之间的值的内部缓存(另请参阅TheLostMind的注释)。这就是为什么我在示例中使用的原因,也是为什么我特别询问取消装箱/装箱而不是比较结果的原因。

  • 问题内容: 当我执行以下操作时, -包含一个元素,它是一个。 -不编译(错误:构造函数未定义) -包含7个元素,它们是对象 这是代码: 问题: 编译器为什么不自动将to 中的元素装箱并创建一个?这是什么原因呢?是我的愚蠢还是其他原因? 问题答案: 区别在于本身是,而是对对象的引用数组。 方法采用某种类型的变量参数,没有上限。该方法的擦除为。这意味着它将接受从扩展的任何类型的可变数量的参数。 由于不

  • 自JDK5.0以来,Java引入了自动装箱/取消装箱。这个技巧很简单而且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java是如何工作的。例如: 拳击 在尝试了不同的情况(、、、)后,编译器接受的唯一情况是做作运算符右侧值的类型为。当我查看的源代码时,我发现它只实现了一个带有参数的构造函数。 所以我的结论是自动装箱的概念是基于在包装类中实现的构造函数。

  • 为什么我们可以将int值和char值都赋给Character Wrapper类型。Autoboxing意味着对相应包装进行装箱,但Character不是int的相应包装。它是Integer 为什么这两种说法都是可能的

  • 问题内容: 我想将原语转换为字符串,然后尝试: 失败并显示以下错误: 现在,我知道原语不是引用类型(即不是对象),因此不能有方法。但是,Java 5引入了自动装箱和拆箱功能(一种C#…我在C#中从未喜欢过,但这不重要)。因此,通过自动装箱,我希望上面将myInt转换为Integer,然后在其上调用toString()。 此外,我相信C#允许这样的调用,除非我记错了。这仅仅是Java的自动装箱/拆箱