Kir*_*ill 5 java types type-conversion
我不明白为什么这段代码没有编译:
Object[] arr = new int[3];
Run Code Online (Sandbox Code Playgroud)
我不需要这段代码.我只想了解自动装箱在这种情况下不起作用的原因?
从这个回答到为什么我们在Java中使用自动装箱和拆箱?,我会引用你的问题的相关细节来回答:
原始变量不能以相同的方式互换,也不能彼此互换,也不能互换
Object
.最明显的原因(但不是唯一的原因)是它们的尺寸差异.这使得原始类型在这方面不方便,但我们仍然需要它们的语言(原因主要归结为性能).
因此,另一方面,对您有用的是:
Object[] arr = new Integer[3];
Run Code Online (Sandbox Code Playgroud)
装箱将原始类型的实例转换为相应包装类型的实例。
它不适用于数组类型。
为什么?
JLS 作者没有对此决定做出解释。然而,有很多原因。以下是一些比较明显的问题。
效率。将 an 转换int[]
为 anObject[]
需要访问并转换数组的所有元素。这是昂贵的(O(N))......并且不应该对程序员隐藏在某些语法后面。
对数组进行装箱必然会创建一个与原始数组本质上不同的新数组。您可以通过以下方式说明这一点:
int[] ints = new int[]{1,2,3};
Integer[] arr = ints; // hypothetical boxing of the elements
// What does ints.equals(arr) return?
array[1] = 0;
// What does ints[0] contain now?
Run Code Online (Sandbox Code Playgroud)
相比之下,(真正的)装箱和拆箱在值之间进行转换,只有在比较指针时才能区分这些值……即使这样,也不能可靠地进行区分。
最重要的是,扩展装箱和拆箱会带来难以解决的效率和概念问题。
归档时间: |
|
查看次数: |
513 次 |
最近记录: |