是否有机会将对象自动转换为Integer?

时间:2015-10-16 16:16:44

标签: java

我想知道以下代码是否适用于任何情况?

Object value = attValue.getValue(); // Returns an Object, might contain an Integer
        if (value instanceof Integer) { 
            if (mAccount.getValue() != value) { // mAccount.getValue() return int
               // Do something here
            }
        }

它适用于我的Android工作室,但不适用于其他一些PC。是什么让它对我有用?

2 个答案:

答案 0 :(得分:12)

是的,这是完全可行的,因为自动装箱的方式可以保证适用于较小的值,并且允许使用较大的值。例如,保证打印为true:

Object x = 5;
Object y = 5;
System.out.println(x == y);

可能打印为true,但不保证:

Object x = 10000;
Object y = 10000;
System.out.println(x == y);

我肯定会尽量不依赖于代码,部分是因为虽然保证重用-128到127(包括{-0}}范围内的值,但是有些JVM 可能重用更广泛的值可能会导致您对代码产生错误的安全感。

在你的情况下,我们不知道你是否看到了平台上的差异(还要记住我们谈论的是Android而不是JVM),或者只是当它“工作”了盒装的价值时很小,当它“不起作用”时却不是。

答案 1 :(得分:10)

您获得了相同的Integer实例,因为Java 5存在Integer Cache。由于该缓存,您获得相同的Integer引用(您获得相同的Integer引用,并且因为它们具有相同的引用,所以它们具有引用标识 - 这是什么==测试)。链接的Integer缓存文档(部分)

  

整数对象在内部缓存,并通过相同的引用对象重用。

     

这适用于-127到+127(最大整数值)范围内的整数值。

     

此整数缓存仅适用于自动装箱。使用构造函数构建整数对象时,它们不会被缓存。