将char传递给带有int参数的方法
以下代码的输出是123
因为substring
从beginIndex到EndIndex – 1.然而,我很惊讶这里的char
被理解为3(int),因为substring
需要两个整数。 这背后的概念是什么?
String x = "12345"; char a = 3; x = x.substring(0, a); System.out.println(x);
这一直回到C ,其中char
本质上是一个窄整数类型,并在必要时隐式转换为int
。
在Java中,这在技术上称为“扩展原始转换”,并在JLS的5.1.2节中介绍 。
其他人已经解释了为什么它有效但注意到使用char变量作为索引是不好的做法,因为它们具有不同的相关语义,因此使用char作为索引会令人困惑。
使用chars只存储字符数据,可能更好:尽量避免使用char,因为它们甚至不足以存储每个字符(参见Unicode和代码点讨论)。 使用int来存储字符代码点。
所以substring的函数声明看起来像substring(int startIndex,int endIndex)。 现在当你传递char时,它会自动提升为整数(endIndex),因此被视为int。
请参阅第5.1.2节,其中讨论了扩展转换。
这称为隐式转换。 如果将int值分配给double,则会发生相同的情况。 快速举例
double d = 1;
1是一个int
但它被隐式转换为double
(1.0)。
在char a = 3;
,你可以把它想象为存储0011
,二进制值为3. char’3’实际上并没有被存储:如果你尝试处理是一个char,你就不会得到3
。 但如果你这样做了
char a = '3';
现在你要存储char 3,ascii值为51,如果你尝试在int中使用它,你会得到51。
从技术上讲,这是因为char
是int
的子类型。
要确定substring(int,int)
是否适用于argument (int,char)
,我们首先尝试15.12.2.2阶段1:识别匹配Arity方法适用于Subtyping ,我们需要测试char
是否是int
的子类型。 按照原始类型中的4.10.1子类型 ,它是。
然后,为了将char
参数赋值给int
参数,根据15.12.4.5创建框架,同步,传输控制 ,我们应用5.3方法调用转换 ,根据5.1.2加宽原始转换将char
转换为int