Win*_*ert 6 java compiler-construction autoboxing primitive-types
Java具有基本类型的object,Integer和原始版本int.
原始版本更快/更轻/等.所以一般来说你应该使用它们.
我想知道为什么Java的设计者不仅拥有对象类型,而且使用原始版本作为幕后优化.
所以:
Integer foo(Integer alpha)
{
Integer total = 0;
for(Integer counter = 0; counter < alpha; counter++)
{
total += counter;
}
return total;
}
Run Code Online (Sandbox Code Playgroud)
将被编译成代码类似于:
int foo(int alpha)
{
int total = 0;
for(int counter = 0; counter < alpha; counter++)
{
total += counter;
}
return total;
}
Run Code Online (Sandbox Code Playgroud)
本质上,这个假设的java编译器会将Integer,Double,Float等实例转换为等效的原始类型.只有在真正需要对象的情况下(比如将元素放在容器中)才会涉及实际的Integer对象.
注意:上面的代码在Integer对象上使用了运算符,我知道实际上并不允许这样做.由于我正在发明假设的Java编译器,我假装这个版本具有Integer/Float/Double的特殊外壳,就像它对String一样.
我想知道为什么Java的设计者不仅拥有对象类型,而且使用原始版本作为幕后优化.
要了解Java设计决策背后的原因,您需要了解它们的历史背景.
原始类型和引用类型之间的强烈区别被融入到JDK 1.0之前的语言设计中.在JDK 1.5之前,就是这样:如果你想将整数放入集合中(例如),你明确使用了Integer.valueOf(int)等等.
当自动装箱/自动拆箱被添加到JDK 1.5中的类型系统时,它必须以向后兼容的方式完成.他们想出的是一个很好的折衷方案......但不是他们从一张干净的床单开始就能/可能取得的成就.
(并且他们第一次没有/不能"正确"的原因......早在20世纪90年代初期,可能与原始语言范围以及他们获得第一次发布的时间压力有关如果他们花了额外的几个月/几年试图做到正确,那么项目可能会被杀死......或者营销窗口会关闭.)
您需要某种方式向编译器发出信号,表明您需要盒装版本,对吧?否则,它怎么知道你想要的是有属性的版本还是原始版本?Integer当您将您传递给评估的方法时会发生什么Integer.MAX_VALUE?
| 归档时间: |
|
| 查看次数: |
749 次 |
| 最近记录: |