许多人建议我阅读“ Java-完整参考”一书。我开始实际阅读它,发现以下内容:
“ 没有自动强制转换或类型冲突的转换 就像某些语言一样。 Java编译器检查所有表达式并 参数以确保类型兼容。任意种类 不匹配是必须在“
与以下内容并不矛盾: System.out.println(“ string” + a);
其中a
是任何原始类型。那不是隐式类型转换,它是一种自动强制。
例如,字符串和整数不是兼容类型。
注意:我不是说英语的人
答案 0 :(得分:0)
可以去的地方总是Java语言规范。在这种情况下,我们正在谈论15.18.1, String Concatenation Operator +:
如果只有一个操作数表达式的类型为
String
,则对另一个操作数执行字符串转换(第5.1.11节),以在运行时生成字符串。
具体来说,根据上下文,符号+
可以表示三种不同的含义:一元加号,字符串串联或加法。
答案 1 :(得分:0)
类型冲突
隐式转换为String
并不冲突。 JLS, Section 5.1.11以一种无冲突的方式定义了这种转换。
基本上,将任何原始类型转换为包装对象类型,然后在引用类型上调用toString()
。此方法是在Object
上定义的,因此可以保证在所有引用类型上都存在。
虽然此转换是“自动的”,但它不是在“ 有冲突的”类型之间,因为存在易于理解的有意义的规则来描述该转换将始终成功(除非从原始值创建对象生成OutOfMemoryError
)。
这与称为缩小原始转换的冲突转换相反,例如int
至byte
。这可能会丢失信息,因此不会隐式发生。它是仅带有显式强制转换的法律代码,例如byte b = (byte) myInt
。
答案 2 :(得分:0)
在Java中,自动类型转换或从一种数据类型扩展到另一种数据类型 之所以发生,是因为两种数据类型兼容并且目标类型更大 比源类型。因此,当Java编译器将数据从一种类型转换为 另一个自动不会丢失任何信息,因为目标类型的内存 总是大于源类型。但是,如果类型不兼容,则java 编译器检查类型兼容性,如果这两种类型不兼容 自动类型转换不会发生。如果这样做会导致信息丢失 自动。因此,java可以防止在不兼容或冲突的数据之间进行自动键入 类型。 为了在不兼容的类型之间转换数据,java的转换范围越来越窄。在 缩小转换范围,两种数据类型可能会兼容,也可能会不兼容, 目标可能大于或可能不大于源。在缩小范围内,用户明确缩小范围 数据,使其适合目标类型。缩小可能会导致有关的信息丢失 例如,将双精度型转换为整数类型时,小数点后的所有信息都会丢失。 Java中的示例:
import java.util.*;
class byteb
{
public static void main(String args [])
{
double a=30.45;
int b;
//b=a;
b=(int)a;
System.out.println("b="+a +"and"+ "a="+b);
}
}