猿问

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

许多人推荐我阅读“Java - 完整参考”一书。我开始阅读它,我发现了这段文字:

在某些语言中,没有冲突类型的自动强制或转换。Java 编译器检查所有表达式和参数以确保类型兼容。任何类型不匹配都是必须在执行之前纠正的错误”

这是否与以下内容相矛盾: System.out.println("string"+ a);

哪里a是任何原始类型。这不是一种自动强制的隐式类型转换。

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

注意:我不是母语为英语的人


喵喔喔
浏览 148回答 3
3回答

慕桂英546537

冲突类型隐式转换String为不冲突。的JLS,5.1.11节,定义了非冲突的方式这种转换。基本上,任何原始类型转换为包装对象类型,然后toString()在引用类型上调用。此方法定义在Object并因此保证存在于所有引用类型上。虽然这种转换是“自动的”,但它不是在冲突类型之间进行的,因为有一个易于理解、有意义的规则描述了总是会成功的转换(除非从原始值创建一个对象生成一个OutOfMemoryError)。这与称为缩小原始转换的冲突转换形成对比,例如intto byte。这可能会丢失信息,因此不会隐式发生。它是只有显式转换的合法代码,例如byte b = (byte) myInt.

qq_花开花谢_0

要去的地方始终是 Java 语言规范。在这种情况下,我们谈论的是15.18.1,字符串连接运算符 +:如果只有一个操作数表达式的类型为String,则在运行时对另一个操作数执行字符串转换(第 5.1.11 节)以生成字符串。特别是,+根据上下文,符号可以表示三种不同的含义:一元加号、字符串连接或加法。

慕后森

在 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);}}        Run code snippetHide resultsExpand snippet
随时随地看视频慕课网APP

相关分类

Java
我要回答