Java原始实现

时间:2011-03-12 00:26:50

标签: java compiler-construction primitive-types autoboxing

Java具有基本类型的object,Integer和原始版本int。

原始版本更快/更轻/等。所以一般来说你应该使用它们。

我想知道为什么Java的设计者不仅拥有对象类型并且使用原始版本作为幕后优化。

所以:

Integer foo(Integer alpha)
{
    Integer total = 0;
    for(Integer counter = 0; counter < alpha; counter++)
    {
        total += counter;
    }
    return total;
}

将编译成类似的代码:

int foo(int alpha)
{
    int total = 0;
    for(int counter = 0; counter < alpha; counter++)
    {
        total += counter;
    }
    return total;
}

本质上,这个假设的java编译器会将Integer,Double,Float等实例转换为等效的原始类型。只有在真正需要对象的情况下(比如将元素放在容器中)才会涉及实际的Integer对象。

注意:上面的代码在Integer对象上使用了运算符,我知道实际上并不允许这样做。因为我正在发明假设的Java编译器,所以我假装它有一个特殊的Integer / Float / Double大小写就像它对String一样。

2 个答案:

答案 0 :(得分:5)

  

我想知道为什么Java的设计者不仅拥有对象类型并且使用原始版本作为幕后优化。

要了解Java设计决策背后的原因,您需要了解它们的历史背景。

原始类型和引用类型之间的强烈区别被融入到JDK 1.0之前的语言设计中。在JDK 1.5之前,所有内容都是:如果你想将整数放入集合中(例如),你明确地使用了Integer.valueOf(int)等。

当在JDK 1.5中向类型系统添加自动装箱/自动拆箱时,必须以向后兼容的方式完成。他们提出的是一个很好的折衷方案......但不是他们从一张干净的床单开始就能/可能取得的成就。

(而且他们之所以没有做到这一点是正确的&#34;第一次......早在20世纪90年代初,可能与原始语言范围有关以及他们为获得第一个版本而施加的时间压力。如果他们花了额外的数月/年来试图做到正确,那么该项目可能会被杀死......或者营销窗口会被关闭。 )

答案 1 :(得分:0)

你需要一些方法向编译器发出你想要盒装版本的信号,对吧?否则,它将如何知道您是否需要具有属性或原始版本的版本?将Integer传递给评估Integer.MAX_VALUE的方法时会发生什么?