我的调查是关于包装,使用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值。
答案 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
。因此,即使在铸造之后,对象的类型也始终保持不变。您只能将视图缩小到具有更高模块性的优点。