Java 5或更高版本是否会对数组应用某种形式的“装箱”?这个问题浮现在脑海中,因为下面的代码通过一个数组,好像它是一个Iterable。
for( String : args ){
// Do stuff
}
答案 0 :(得分:5)
数组不是原语。基元是不是对象的东西。只有boolean,char,byte,short,int,long,float和double才是原语。 Arrays是具有特殊语法的对象。如果你可以在Java中调用toString()类型< 5它不是原始的。
所有自动装箱都是将原语转换为/来自期望诸如ArrayList之类对象的对象。它允许代码如下:
List<Integer> l = new ArrayList<Integer>();
l.add( 7 );
int i = l.get(0);
成为简称:
List<Integer> l = new ArrayList<Integer>();
Integer ii = Integer.valueOf( 7 )
l.add( ii );
int i = l.get(0).getIntValue();
这就是所有自动装箱。由于String已经是一个对象(并且不像C语言中那样等效于char []),因此没有任何内容可以将/ unbox String转换为。
编辑:添加了布尔值
答案 1 :(得分:3)
由于您似乎特别想知道增强的for循环,答案是它们是特殊的,而不是未装箱的。来自§14.14.2:
增强的for语句具有以下形式:
EnhancedForStatement: for ( VariableModifiersopt Type Identifier: Expression) Statement
Expression必须具有Iterable类型,否则它必须是数组类型(第10.1节),否则会发生编译时错误。
实际上,如果表达式是一个数组,它将被转换为等效的索引for循环,而不是实际使用迭代器。精确的扩展包含在语言规范的同一部分中。
答案 2 :(得分:2)
不,数组总是引用类型。除非它在每个元素的访问权限上,否则不需要装箱或拆箱。例如:
int[] x = new int[10]; // The value of x is a reference
int y = x[0]; // No boxing
Integer z = x[1]; // Boxing conversion from x[1] (which is an int) to Integer
另请注意,尽管增强的for循环可用于数组和迭代,但每个数组的编译方式都不同。
有关增强型for循环的两种不同翻译,请参阅JLS的section 14.14.2。
答案 3 :(得分:1)
没有
与基元不同,数组(和字符串)是Object
s。