在创建一个新数组时使用"char": int[] a = new int['a']。

7
在创建数组时,我们可以传递shortcharbyteint。那么,为什么int[] a = new int['a']是有效的呢?它不会抛出编译时错误。
这种形式的数组声明是什么意思?

'a' 是一个 char 字面量。在 Java 中,char 是一种数值类型,因此该类型的表达式可以用于需要数字的地方,包括指定数组的大小。 - John Bollinger
1
@Oleksandr,我认为这个问题与那个不同。 - Sweeper
@Sweeper 而且它仍然有效地是相同的答案:https://dev59.com/8l7Va4cB1Zd3GeqPJWjx#8549716 D: (虽然这里给出的答案更精确,格式更好。) - user2864740
当我尝试查找这个数组的长度时,我得到了97。也就是说,int[] a = new int['a']; 实际上创建了一个长度为97的数组。97是'a'的ASCII值。 - kwishna
1
@ABD 请考虑通过点击那个勾选标记来接受最有帮助的答案。 - Sweeper
5个回答

8

来自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。

5

像大多数涉及此类问题一样,答案在Java语言规范中:

§ 5.1.2. 扩展原始类型转换

原始类型的19种特定转换称为扩展原始类型转换:

  • byteshortintlongfloatdouble
  • shortintlongfloatdouble
  • charintlongfloatdouble
  • intlongfloatdouble
  • longfloatdouble
  • floatdouble

(我加粗了)

可能有些直觉,但是 char 实际上是一种整数类型,Java 规定原始整数类型可以转换为低容量或高容量的整数类型。在这种情况下,它被称为 扩展原始类型转换


Andy's answer提供了更多的Java语言规范参考,并明确说明了像你问题中的表达式是有效的。


2
根据JLS §15.10.1数组创建表达式,
每个DimExpr中的维度表达式类型必须是可转换(§5.1.8)为整数类型,否则会出现编译时错误。
每个维度表达式都要进行一元数字提升(§5.6.1)。提升后的类型必须为int,否则会出现编译时错误。
这里发生了一元数字提升。以下是§5.6.1的摘录:
...如果操作数的编译时类型是byte、short或char,则通过扩展原始转换(§5.1.2)将其提升为int类型的值。
因此,new int['a']是有效的。
如果你想知道char如何转换为int,以下是§5.1.2的相关部分:
将char扩展为整数类型T的扩展转换将char值的表示扩展到更宽的格式中。
还要注意的是,字符都被编码为整数。

1
在Java中,char是整数类型(你好C ++)。这段代码做同样的事情:int [] a = new int [97];

0

a 是一个 char 类型,它被隐式转换为一个整数,值为 97(ASCII 表示法,请参见 这里)。因此,您正在创建一个长度为 97 的数组。


实际上,它创建了一个长度为97的数组。 - lealceldeiro
长度将为97。 - kwishna
@lealceldeiro 是的,我的错,我看错了表格,谢谢!(: - Jezor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接