【问题标题】:Conversion of one primitive type to another in java在java中将一种原始类型转换为另一种
【发布时间】:2018-09-01 06:36:46
【问题描述】:

在下面的代码中

  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/)

【问题讨论】:

  • 您通过传递一个 int 作为参数来调用 int 重载。为什么不输出int?
  • 1 = int。 1.0 = 双倍。 1.0f = 浮动。 1L = 长;不能对字节或短使用文字(没有转换)。
  • 好的。所以基本上要传递除 int 以外的任何其他数据类型(在这种情况下),我们应该键入 cast 并发送。是正确的还是我遗漏了什么?

标签: java type-conversion overloading


【解决方案1】:

Int 字面量(如1)是int 类型的表达式。

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

  1. 如果有一个重载,其中实际参数与形参具有相同的类型,请调用它。
  2. 如果存在单个非可变参数重载,其中实际参数可以自动转换(例如,通过扩展或取消/装箱)与形参的类型相同,请调用它。
  3. 如果存在单个可变参数重载,其中实际参数可以自动转换为与调用的形式参数相同的类型。
  4. 否则,错误。

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

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

【讨论】:

  • 为什么不调用 m1(long)?
  • @Niharika 因为你正在传递一个 int。
  • 谢谢 :)。那么,调用 m1(long/short/byte),类型转换是唯一的方法吗?
  • @Niharika 不,您可以将这些类型的变量作为参数传递。如果要传递文字,可以传递长文字(1L);但是对于short和byte,是的,你必须转换。
【解决方案2】:

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

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

【讨论】:

  • 那么为什么不调用 m1(short) 或 m1(byte) 呢?
【解决方案3】:

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

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

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

关于您的评论:自动化仅在需要时才起作用。但在您的情况下:A)您使用的是 int 值 B)有一个 int-take 方法。编译器不会无缘无故地将整数变成长整数!

【讨论】:

  • 1 最适合短或字节,对吗?那么,为什么调用 m1(int) 呢?能具体点吗?
  • 否:1 是一个整数。它不是字节,也不是短的,也不是长的。这是它所具有的类型,而 int 重载是将被调用的类型,因为这就是重载解析被定义为工作的方式。
  • @Niharika 我做了一些更新,但说真的:你应该在这里查阅一些书籍/教程。并且:请不要忘记在某个时候接受其中一个答案。
猜你喜欢
  • 2023-01-04
  • 2023-02-07
  • 2012-03-28
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2020-12-14
相关资源
最近更新 更多