猿问

java中一种原始类型到另一种类型的转换

在下面的一段代码中


  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”?


如果按照从“byte”->“short”->“int”->“long”->“float”->“double”的自动转换,那么输出应该打印“double”对吗?


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


森林海
浏览 159回答 3
3回答

幕布斯7119047

整型文字(如1)是 type 的表达式int。重载解析分多个阶段进行,寻找可以接受您传递的类型的参数的方法。如果存在单个重载,其中实际参数与形式参数具有相同的类型,则调用该重载。如果存在单个非可变参数重载,其中实际参数可以自动转换(例如通过加宽或取消/装箱)为与形式参数相同的类型,请调用它。如果存在单个可变参数重载,其中实际参数可以自动转换为与调用它的形式参数相同的类型。否则,错误。这些阶段依次应用,一直持续到找到匹配项。由于存在过载m1这需要int,匹配在阶段1中发现,使值的另一种类型,需要的不是转换发生。

波斯汪

根据定义,该原始文字的类型为 int。任何没有小数点的数字文字都是int类型,除非您将 al/L 放入其中:1L将其转换为 long。没有 1 个“字节”文字,你必须去(byte) 1那里。编译器寻找最合适的,并使用该方法接受一个 int。这就是全部。如果您想查看要调用的其他方法,例如将值转换为 (long),或者开始使用诸如 1.0 而不是 1 之类的值。关于您的评论:只有在需要时才会出现自动化。但在您的情况下:A) 您使用的是int值 B) 有一个 int-taking 方法。编译器不会无缘无故地将整数转换为长整数!

长风秋雁

自动转换仅在方法接受比输入更宽的类型时发生。例如,如果您删除void m1(..)除long版本之外的所有功能。然后可以传入一个整数,整数会自动加宽为long。在您的示例中,有一个接受整数的方法,因此 java 将改用该方法,并且不会发生扩大。
随时随地看视频慕课网APP

相关分类

Java
我要回答