关于Java中的自动强制问题?

时间:2018-09-17 20:36:28

标签: java

许多人建议我阅读“ Java-完整参考”一书。我开始实际阅读它,发现以下内容:

  

没有自动强制转换或类型冲突的转换   就像某些语言一样。 Java编译器检查所​​有表达式并   参数以确保类型兼容。任意种类   不匹配是必须在“

与以下内容并不矛盾: System.out.println(“ string” + a);

其中a是任何原始类型。那不是隐式类型转换,它是一种自动强制。

例如,字符串和整数不是兼容类型。

注意:我不是说英语的人

3 个答案:

答案 0 :(得分:0)

可以去的地方总是Java语言规范。在这种情况下,我们正在谈论15.18.1, String Concatenation Operator +

  

如果只有一个操作数表达式的类型为String,则对另一个操作数执行字符串转换(第5.1.11节),以在运行时生成字符串。

具体来说,根据上下文,符号+可以表示三种不同的含义:一元加号,字符串串联或加法。

答案 1 :(得分:0)

  

类型冲突

隐式转换为String并不冲突。 JLS, Section 5.1.11以一种无冲突的方式定义了这种转换。

基本上,将任何原始类型转换为包装对象类型,然后在引用类型上调用toString()。此方法是在Object上定义的,因此可以保证在所有引用类型上都存在。

虽然此转换是“自动的”,但它不是在“ 有冲突的”类型之间,因为存在易于理解的有意义的规则来描述该转换将始终成功(除非从原始值创建对象生成OutOfMemoryError)。

这与称为缩小原始转换的冲突转换相反,例如intbyte。这可能会丢失信息,因此不会隐式发生。它是仅带有显式强制转换的法律代码,例如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);
}
}