在创建数组时,我们可以传递
这种形式的数组声明是什么意思?
short
、char
、byte
、int
。那么,为什么int[] a = new int['a']
是有效的呢?它不会抛出编译时错误。这种形式的数组声明是什么意思?
来自JLS第15.10.1节:
DimExpr中每个维度表达式的类型必须是可转换(§5.1.8)为整数类型的类型,否则会发生编译时错误。
每个维度表达式都要进行一元数值提升(§5.6.1)。提升后的类型必须是int,否则会发生编译时错误。
而来自JLS第5.6.1节:
如果操作数的编译时类型为Byte、Short、Character或Integer,则会进行拆箱转换(§5.1.8)。然后,通过扩展原始转换(§5.1.2)或标识转换(§5.1.1)将结果提升为int类型的值。
和
否则,如果操作数的编译时类型为byte、short或char,则通过扩展基本转换(§5.1.2)将其提升为int类型的值。因此,任何Byte、Short、Character、Integer、byte、short、char或int都是可以接受的。因此,允许使用字符字面量'a',并将其提升为int值97。像大多数涉及此类问题一样,答案在Java语言规范中:
原始类型的19种特定转换称为扩展原始类型转换:
byte
转 short
、int
、long
、float
或 double
short
转 int
、long
、float
或 double
char
转 int
、long
、float
或 double
int
转 long
、float
或 double
long
转 float
或 double
float
转 double
(我加粗了)
可能有些直觉,但是 char
实际上是一种整数类型,Java 规定原始整数类型可以转换为低容量或高容量的整数类型。在这种情况下,它被称为 扩展原始类型转换。
Andy's answer提供了更多的Java语言规范参考,并明确说明了像你问题中的表达式是有效的。
int [] a = new int [97];
a
是一个 char
类型,它被隐式转换为一个整数,值为 97
(ASCII 表示法,请参见 这里)。因此,您正在创建一个长度为 97 的数组。
'a'
是一个char
字面量。在 Java 中,char
是一种数值类型,因此该类型的表达式可以用于需要数字的地方,包括指定数组的大小。 - John Bollinger