隐式转换为字符串 - toString和int +""

Mic*_*Neo 6 java casting implicit

为什么当我使用它:

int a = 1;
methodWithParamString(a + "");
Run Code Online (Sandbox Code Playgroud)

a被强制转换为String,我不能在整数上使用toString()吗?

int a = 1;
methodWithParamString(a.toString());
Run Code Online (Sandbox Code Playgroud)

这不是:a+""工作如下:a.toString() + ""?

biz*_*lop 10

不,它有点像String.valueOf( a ) + "",反过来表现得像new StringBuilder( String.valueOf( a ) ).append( "" ).toString().

重要的是要知道它完全由编译器完成,换句话说就是它的语法糖.这就是为什么在循环中将字符串组合在一起并不是一个好主意.(尽管现代VM可能有一些机制来降低性能开销.)

  • 顺便说一句:`String.valueOf(a)`仅调用`Integer.toString(a)` (2认同)

Ste*_*n C 6

a被强制转换为String

不.它被转换为String.(您无法隐式或显式地将基本类型转换为String.)

此转换的详细信息在JLS- 15.18.1.1中指定 .该规范声明,对于基本类型,转换"就像"您创建了适当的包装类型的实例然后toString()在其上调用.这使得Java编译器可以选择使用其他方法,只要最终结果相同.(对于引用类型,通过调用转换null为"null"和其他非String类型转换为String toString().)

JLS声明连接随后通过调用"好像"执行String.concat(...),注意到JLS明确允许优化连接序列.(JLS 15.18.1.2)