2012-12-15 77 views
3

下面是此代码:从原始型隐式转换为Object

int[] someArray = {0, 1, 2, 3}; 
//System.out.println(someArray[0].toString()); int cannot be dereferenced 
// creating Object element with use of primitive element fails 
//Object newObject = new Object(someArray[0]); constructor Object in class java.lang.Object cannot be applied to given types; 
for(Object someObject : someArray) 
{ 
    // here int is casted to Object 
    System.out.println(someObject.toString()); // prints 0, 1, 2, 3 
} 

它是如何发生的是原始类型变量(阵列的元件)不能被明确地铸造在for循环此原语元素到对象,但是以某种方式被铸造成对象?

+0

有趣的问题。我的猜测是增强的数组foreach循环的工作原理是创建某种内部迭代器类来填充给定的基本类型。即你不是直接在数组上迭代,而是在隐藏的'迭代器'上进行迭代。 – millimoose

+3

你并没有在你的评论中任何地方投射。 'int x = 5; System.out.println(((Object)x));'一定会正常工作,即使没有循环。 –

+0

@ThomasJungblut问题是,foreach循环通常不会为你做这种投射。 – millimoose

回答

5

自1.5,Java编译器会自动当上下文调用它拆箱基本类型。 (也就是说,一个int被包装在一个Integer对象中,反之亦然。)发生这种情况时在原始对象变量和对象变量之间分配。 (或铸造一个原语的一个对象类型)因此,例如,下面的代码是有效的:

int i = 123; 
Object o = i; 

这同样适用于所述隐式分配Object someInt = someArray[…],编译器发出用于foreach循环。

为什么someArray[0].toString()不工作的原因是,你并没有使用someArray[0]一个对象类型的变量或做其他事情会告诉编译器autobox - 试图调用的方法在原始根本无法识别作为发生这种情况的条件之一。

相关问题