在Java

时间:2018-09-01 06:36:47

标签: java type-conversion overloading

在下面的代码中

  class Main {

    void m1(double x){

        System.out.println("double");
    }

    void m1(float x){

        System.out.println("float");
    }

    void m1(long x){

        System.out.println("long");
    }

    void m1(byte x){

        System.out.println("byte");
    }

    void m1(short x){

        System.out.println("short");
    }

    void m1(int x){

        System.out.println("int");
    }


    public static void main(String[] args) {

      Main m = new Main();
         m.m1(1);
    }
}

为什么输出的是“ int”而不是“ byte”或“ long”或“ short”或“ float”或“ double”?

如果通过从“字节”->“短”->“ int”->“长”->“浮点数”->“双精度”进行自动转换,那么输出应该打印“双精度”对吗?

https://www.geeksforgeeks.org/type-conversion-java-examples/

3 个答案:

答案 0 :(得分:0)

Int文字(例如1)是类型int的表达式。

重载解析过程分多个阶段进行,寻找一种可以接受所传递类型的参数的方法。

  1. 如果单个重载的实际参数与形式参数的类型相同,则调用它。
  2. 如果存在单个非varargs重载,并且可以自动将实际参数转换为(例如,通过加宽或取消装箱)其类型与形式参数相同,则调用它。
  3. 如果存在单个varargs重载,则实际参数可以自动转换为与形式参数调用类型相同的类型。
  4. 否则,错误。

依次应用这些阶段,直到找到匹配项为止。

由于m1的重载占用int,因此在阶段1中找到了匹配项,因此无需将该值转换为另一种类型。

答案 1 :(得分:0)

根据定义,该原始文字为int类型。任何不带小数点的数字文字,其类型都为 int ,除非您在其中输入l / L:1L将其转换为长整数。没有1个“字节”文字,您必须去(byte) 1才能到达那里。

编译器会寻找最合适的,并使用需要int的方法。

这就是全部。如果要查看其他方法的调用,请将该值强制转换为(long),或者开始使用1.0而不是1之类的值。

关于您的评论:自动主义仅在需要时加入。但在您的情况下:A)您使用的是 int 值B)有一种整数获取方法。编译器无缘无故将int转换为longs变成double!

答案 2 :(得分:0)

仅当方法接受的类型大于输入的类型时,才会发生自动转换。例如,如果您删除除void m1(..)版本以外的所有long函数。然后,您可以传入一个整数,该整数将自动加长。

在您的示例中,有一个接受整数的方法,因此java将改用该方法,并且不会扩展。