【问题标题】:Autoboxing/Unboxing while casting Integer to int using 'cast' method使用“cast”方法将 Integer 转换为 int 时自动装箱/拆箱
【发布时间】:2015-10-10 09:33:20
【问题描述】:

这是一个非常简单的案例:我正在尝试将 Object 类型转换为这样的原始类型:

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();
}

为什么会这样?其他原语也是如此。

Live Example

【问题讨论】:

  • 好吧,isInstance 的文档指定:“如果这个 Class 对象表示原始类型,则此方法返回 false。”所以这并不奇怪 - 但cast 文档应该说它对于原始类型总是会失败。
  • 所以我不应该对基元使用强制转换方法,而是直接使用 (int) 进行强制转换?
  • @AnmolGupta:是的,基本上。

标签: java casting autoboxing


【解决方案1】:

cast 不能很好地用于原语,因为它不能返回实际原语类型的值,因为 Java 中的泛型......所以无论如何它最终都会再次装箱。而且,如果您不直接分配 int 值,那么它也必须因为这个原因而被装箱。

所以基本上,如果你想转换成int,直接投就行了。

isInstancedocumented 始终返回 false 用于基元:

如果此Class 对象表示原始类型,则此方法返回false

...cast 应该也是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2011-02-27
    • 2011-05-02
    相关资源
    最近更新 更多