对象是否存在本机类型安全包装和拆箱?

时间:2017-08-15 19:00:06

标签: java types

我的调查是关于包装,使用Object类作为我的包装器。

我的目标是使用原始int(或int的包装器)并从通用Object中取消它。

唯一的问题是我将在运行时使用混合类型,因此我无法一般性地键入方法的返回类型。 T var1!=(T)var2

我现在可以做的是有过多的开销,因为我不能假设Object包含int类型的值,所以我解析它。

Object int_wrapped_in_object = 1;

Integer.valueOf(String.valueOf(int_wrapped_in_object));

//I could cast from Object to int with:
//(int) int_wrapped_in_object
//but this will always anticipate a classcastexception in case the value was wrapped with another type, like String

这很有效,但我最好跳过解析步骤,然后只打开整数值框。

整数包装类不支持 valueOf(Object o),可能是因为Object没有实现相对强制转换。它(Object)支持 toString()。但不是toInt()。它非常奇特,因为Object确实可以包装一个原始int。为什么会出现这种情况高于我的知识水平,所以我只能使用我的工作。据我所知,甚至可能存在本地支持将对象解包为int。

请帮我找到一个解决方案,该解决方案涉及使用最少的解析并引入少量异常来获取原始int值。

2 个答案:

答案 0 :(得分:5)

对你的误解:

Object int_wrapped_in_object = 1;

int_wrapped_in_object的类型整数,而不是对象!编译器已经为你准备好了!

换句话说:java编译器会有 no 方式" box"将int转换为" only"的对象即可。

因此,如果该Object实际上是一个Integer,那么您需要设置一个简单的int_wrapped_in_object instanceof Integer。然后你可以简单地施放

答案 1 :(得分:2)

您的值会被包裹到Integer,然后通过将其转换为Object来减少其视图。

如果您使用instanceof检查类型,则可以稍后安全地将其强制转换回来。然后,您可以使用int方法将其展开到Integer#intValue

// Indirect conversion int -> Integer and then reduced view to Object
Object int_wrapped_in_object = 5;

if (int_wrapped_in_object instanceof Integer) {
    // Checked cast as the object indeed is an Integer but with reduced view
    Integer intAsInteger = (Integer) int_wrapped_in_object;

    // Retrieve the int value from the Integer
    // (you could also do an implicit unwrapping here) like
    // int value = intAsInteger;
    int value = intAsInteger.intValue();

    System.out.println("The value is: " + value);
} else {
    throw new IllegalStateException("Value is no Integer but it should.");
}

注意该行

Object int_wrapped_in_object = 5;

间接转换为

Object int_wrapped_in_object = (Object) Integer.valueOf(5);

如果您需要经常进行此类转化,那么只需创建实用程序方法即可。

请注意,对象本身保留Integer并且不会转换Object,这不是投射的工作方式,只是减少了视图。您可以使用

进行检查
System.out.println(int_wrapped_in_object.getClass())

它将打印class java.lang.Integer而不是class java.lang.Object。因此,即使在铸造之后,对象的类型也始终保持不变。您只能将视图缩小到具有更高模块性的优点。