虽然创建一个数组,我们可以通过short,char,byte,int.那么,[为什么] int[] a = new int['a']有效?它不会抛出编译时错误.
这种形式的数组声明是什么意思?
DimExpr中每个维度表达式的类型必须是可转换(第5.1.8节)为整数类型的类型,否则会发生编译时错误.
每个维度表达式都经过一元数字推广(第5.6.1节).提升类型必须为int,否则会发生编译时错误.
如果操作数是编译时类型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',允许使用char字面值,并将其提升为int值97.
像大多数时候这样的问题,答案在于Java语言规范:
§5.1.2.扩大原始转换
对原始类型的19个特定转换称为扩展原始转换:
byte对short,int,long,float,或者doubleshort对int,long,float,或者doublechar对int,long,float,或者doubleint到long,float或doublelong到float或doublefloat至double
(强调我的)
它可能是也可能不是直观的,但是a char实际上是一个整数类型,并且Java规则指定可以将原始整数类型转换为具有更低或更高容量的整数类型.在这种情况下,它被称为扩展原始转换.
Andy的回答提供了对Java语言规范的更多参考,并明确指出问题中的表达式是有效的.