繁体   English   中英

为什么 Java 编译器默认将长数据类型视为双精度而不是 Integer?

[英]Why Does Java Compiler Treat Long Data Type As Double Instead of Integer By Default?

我是 Java 的新手,我在测试一些代码时偶然发现了这一点。 为什么 Java 将 x(数据类型为 long)传入 function 接受双参数而不是 integer 参数。 如果有人能向我解释原因,我将不胜感激(尽管这对你们大多数人来说可能是一个简单的问题!)提前谢谢你!

public class Hello {
public static void main (String [] args) {
    long x=1;
    System.out.println("Before calling the method, x is "+x);
    increase(x);
    System.out.println("After calling the method, x is "+x);
    System.out.println();

    double y=1;
    System.out.println("Before calling the method, y is "+y);
    increase(y);
    System.out.println("After calling the method, y is "+y);


}

public static void increase(int p) {
    p+=1;
    System.out.println(" Inside the method is "+p);

}

public static void increase(double p) {
    p+=2;
    System.out.println(" Inside the method is "+p);

}   }

调用方法时允许的转换由 JLS 第 5 章定义。隐式原始转换必须是加宽的,也就是说,不会导致幅度损失(尽管在 long 到 double 的情况下,可能会导致精度损失)。

有六种转换上下文,其中多边形表达式可能受上下文影响或可能发生隐式转换。 每种上下文对多表达式类型都有不同的规则,并允许在上述某些类别中进行转换,但不允许在其他类别中进行转换。 上下文是:

...

严格的调用上下文(§5.3、§15.9、§15.12),其中参数绑定到构造函数或方法的形式参数。 可能会发生扩大原语、扩大参考和未经检查的转换。

松散的调用上下文(第 5.3 节、第 15.9 节、第 15.12 节),其中,与严格调用上下文一样,参数绑定到形式参数。 如果仅使用严格的调用上下文无法找到适用的声明,则方法或构造函数调用可以提供此上下文。 除了扩大和未经检查的转换外,此上下文还允许进行装箱和拆箱转换。

JLS 11第5章

从 long 转换为 int 是一种缩小的原始转换,因为它可能会导致幅度信息的丢失。 因此,除非您首先明确转换为(int) ,否则不会调用它。

您有 2 个用于 increase() 的重载方法,其中 int 和 double 作为输入参数。 您还将输入参数作为长类型传递。

在 Java 中,UpCasting 以以下格式发生。

byte -> short -> int -> long -> float -> double

因此,当您将 long 类型值作为输入参数传递时,编译器首先会在输入参数中查找完全匹配。 如果没有找到,那么它将向上转换到下一个值。

因此,长值可以被具有双值作为输入参数的方法接受。

请通过以下网址 go。
Java中的类型转换
类型转换 - Oracle 文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM