当前位置: 首页 > 面试题库 >

Java 6与Java 7在自动拆箱中的差异

严升
2023-03-14
问题内容

我已经注意到Java SE 6和Java SE 7在自动拆箱行为上的差异。我想知道为什么会这样,因为我找不到这两个版本之间这种行为变化的任何文档。

这是一个简单的例子:

Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];

使用Java SE 7中的javac可以很好地进行编译。但是,如果我给编译器指定“ -source 1.6”参数,则在最后一行会出现错误:

inconvertible types
found   : java.lang.Object
required: int

我尝试下载Java SE 6以使用本机版本6编译器进行编译(没有任何-source选项)。它同意并给出与上述相同的错误。

那有什么呢?从更多的实验来看,Java 6中的拆箱似乎只能拆装明显(在编译时)属于装箱类型的值。例如,这在两个版本中都适用:

Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];

因此,似乎在Java
6和7之间,取消装箱功能得到了增强,以便可以一口气对对象类型进行转换和取消装箱,而无需(在编译时)知道该值是正确的装箱类型。但是,通读Java
7发行时编写的Java语言规范或博客文章,我看不到这件事有任何变化,所以我想知道变化是什么,这个“功能”被称为什么?

只是出于好奇:由于更改,有可能触发“错误的”装箱:

Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];

这样可以很好地编译,但是在运行时给出ClassCastException。

有什么参考吗?


问题答案:

与Java 5/6
JLS中的同一部分
相比,Java
5.5 JLS
5.5的转换部分中的语言似乎已更新,可能是为了澄清允许的转换。

Java 7 JLS说

通过取消装箱转换,可以将引用类型的表达式转换为原始类型而没有错误。

Java 5/6:

通过取消装箱转换,可以将引用类型的值强制转换为基本类型(第5.1.8节)。

Java 7 JLS还包含一个允许从参考类型到基元的转换的表(表5.1)(该表未包含在Java 5/6
JLS中)。这明确列出了从Object到基元的转换,作为带拆箱的缩小参考转换。

原因在此电子邮件中说明:

底线:如果规格。允许(Object)(int)它也必须允许(int)(Object)。



 类似资料:
  • 本文向大家介绍自动装箱和拆箱?相关面试题,主要包含被问及自动装箱和拆箱?时的应答技巧和注意事项,需要的朋友参考一下 自动装箱是Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。 比如:把int转化成 Integer,double转化成 Double,等等。反之就是自动拆箱。 原始类型: boolean,char,byte,short,int,long,float,double 

  • 问题内容: 为什么第二段代码更快? 问题答案: 自动装箱使用,内部将Integer对象缓存为小整数(默认情况下为-128至127,但是最大值可以使用“ java.lang.Integer.IntegerCache.high”属性进行配置-请参见Integer.valueOf的源代码) ,因此与直接调用不同。因为在调用之前可以快速检查整数值的大小,所以直接调用要快一些(尽管如果您有很多小整数,它会使

  • 问题内容: 从JDK 5.0开始,自动装箱/拆箱是在Java中引入的,这种技巧很简单而且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java中的工作原理: Boxing 尝试不同的情况下后(),这是由编译器所接受的唯一情况是,当值的上做作运算符右侧的类型是int。当我查看源代码时,发现它仅实现一个带参数的构造函数。 因此,我的结论是,自动装箱的概念基于

  • 本文向大家介绍Java中自动装箱、拆箱引起的耗时详解,包括了Java中自动装箱、拆箱引起的耗时详解的使用技巧和注意事项,需要的朋友参考一下 什么是自动装箱,拆箱 先抛出定义,Java中基础数据类型与它们的包装类进行运算时,编译器会自动帮我们进行转换,转换过程对程序员是透明的,这就是装箱和拆箱,装箱和拆箱可以让我们的代码更简洁易懂 耗时问题 在说 Java 的自动装箱和自动拆箱之前,我们先看一个例子

  • 问题内容: 自动装箱是Java编译器在原始类型及其对应的对象包装器类之间进行的自动转换。例如,将int转换为Integer,将double转换为Double,依此类推。如果转换结果相反,则称为拆箱。 那么,为什么我们需要它?为什么要在Java中使用自动装箱和拆箱呢? 问题答案: 需要一些上下文来充分理解其背后的主要原因。 基元与类 Java中的原始变量包含值(整数,双精度浮点二进制数等)。由于这些

  • 请帮我想想为什么这行不通。(这不是一个实际问题,而是OCPJP考试的心理练习。) //编译器错误:类型不兼容;必需:短,找到:整数 我假设编译器尝试在没有(或之前)拆箱的情况下先进行强制转换,而例如算术操作(iBoxediBoxedi)将首先拆箱。因此,是否可以说自动装箱/取消装箱在操作顺序(一元、算术、关系、逻辑、条件、分配)中占有一席之地,它到底在哪里? 我在下面的源代码中读到了有关强制转换的