将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。

从技术上讲,这是因为charint的子类型。

要确定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