Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java原语实现_Java_Compiler Construction_Primitive Types_Autoboxing - Fatal编程技术网

Java原语实现

Java原语实现,java,compiler-construction,primitive-types,autoboxing,Java,Compiler Construction,Primitive Types,Autoboxing,Java有基本类型的object、Integer和primitive版本int 基本版本更快/更轻/等等。因此,一般来说,您应该使用它们 我想知道的是,为什么Java的设计者不仅拥有对象类型,而且在幕后使用原始版本作为优化 因此: Integer foo(Integer alpha) { 整数合计=0; 用于(整数计数器=0;计数器

Java有基本类型的object、Integer和primitive版本int

基本版本更快/更轻/等等。因此,一般来说,您应该使用它们

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

因此:

Integer foo(Integer alpha)
{
整数合计=0;
用于(整数计数器=0;计数器
将被编译成如下代码:

int foo(int alpha)
{
    int total = 0;
    for(int counter = 0; counter < alpha; counter++)
    {
        total += counter;
    }
    return total;
}
intfoo(intalpha)
{
int-total=0;
用于(int计数器=0;计数器
本质上,这个假设的java编译器将Integer、Double、Float等的实例转换为等效的原语类型。只有在真正需要对象的情况下(比如将元素放入容器中),才会涉及实际的整数对象


注意:上面的代码在整数对象上使用了运算符,我知道这实际上是不允许的。既然我发明了假设的Java编译器,我就假设这一个对Integer/Float/Double有特殊的大小写,就像对String有特殊的大小写一样。

您需要某种方式向编译器发出信号,表示您想要盒装版本,对吗?否则,它如何知道您想要的是具有属性的版本还是基本版本?将
整数
传递给计算
整数.MAX_值
的方法时会发生什么情况

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

要理解Java设计决策背后的原因,您需要了解做出这些决策的历史背景

基本类型和引用类型之间的强烈区别在JDK1.0之前的语言设计中已经体现出来。在JDK1.5之前,这就是全部内容:如果您想将整数放入集合(例如),则显式使用
Integer.valueOf(int)

在JDK1.5中将自动装箱/自动取消装箱添加到类型系统时,必须以向后兼容的方式进行。他们想出了一个很好的折衷方案。。。但如果他们从零失球开始,就不会/可能取得什么成绩


(以及他们没有/不能“做对”的原因)第一次……追溯到20世纪90年代初,可能与原始语言的范围以及他们在发布第一个版本时所面临的时间压力有关。如果他们花了数月/数年的时间试图将其正确化,项目可能会被扼杀……或者营销窗口可能会关闭。)

并非完全相同,但我在@glowcoder中介绍了很多这方面的信息,我知道所有这些。但我想知道是否有什么东西会阻止Java在幕后做所有这些事情,而不让我们担心它。也就是说,我们不需要考虑性能问题,因为编译器自己将Long的用法转换为Long似乎很简单。我很高兴java有原语;它们直接映射到硬件,我从未将它们视为障碍。要求使用极端逃避分析工具的要求太高了。想象一下整数[],您认为优化、转义分析它并生成与int[]相同的代码有多容易(该整数可以为空)。此外,整数是不可变的,并且有一个最后的字段,它阻止了一些优化,甚至需要进一步的分析。@ BestSSS,我没有考虑过一个空整数引用的问题,这几乎破坏了我的想法。(如果你把它作为一个问题,我会接受它,因为这是我一直在寻找的答案,而不是“他们没有时间了”)我的想法是,你可以通过将Integer的每个用法都转换为int来避免逃避分析。当分配给对象引用时,就会发生自动装箱。但我知道这样的尝试并不能完全保留正确的对象语义。Integer.MAX_值是Integer类上的一个静态常量。不需要担心一个实际的整数对象就可以得到那个整数对象。只要你真正需要一个整数对象,你就会自动装箱。+1-因为上下文是最重要的,尽管我很确定语言设计者会知道怎么做。毕竟,有一些纯对象语言早于Java;根据我的经验,大多数对纯OO的偏离都是为了让来自C的人生活得更轻松。
int foo(int alpha)
{
    int total = 0;
    for(int counter = 0; counter < alpha; counter++)
    {
        total += counter;
    }
    return total;
}