【问题标题】:java method overloading: abnormal behaviourjava方法重载:异常行为
【发布时间】:2014-09-30 15:02:52
【问题描述】:

我尝试了以下两种情况:

void ssss(int b){
   System.out.println ("int"+b);
}
void ssss(double b){
   System.out.println ("long"+b);
}

并进行了方法调用

ssss(100);

这很好用。

void calcAve(double marks1, int marks2) {
   System.out.println ("first average");
}
void calcAve(int marks1, double marks2) {
   System.out.println ("second average");
}

并进行了方法调用

calcAve(2,3);

这返回了一个编译错误:对 calcAve 的引用不明确。

了解为什么第二个会出现编译错误。我的问题是使用相同的类比,第一种情况也应该返回错误,但事实并非如此。为什么??

【问题讨论】:

  • 因为 2 可以是有效的 int 或 double
  • 因为您有 2 个可以采用整数的重载方法。 (双,整数)以及(整数,双)。就像@getlost 所说,2 可以被视为int 以及double
  • 在第二种情况下,您的数据类型不匹配
  • 你应该知道什么是 double 什么是 int。可以转换为 calcAve((int)2,3);

标签: java overloading


【解决方案1】:

直观地说,在第一种情况下,有一个精确的类型匹配,而在第二种情况下,有两个同样好的不精确匹配(两个ints 中的任何一个都可以提升为double)。

确切的规则相当复杂,但您可以在 JLS 中找到它们:§15.12.2. Compile-Time Step 2: Determine Method Signature

解决歧义的一种方法是更改​​参数的类型:

calcAve(2.0, 3);
calcAve(2, 3.0);

【讨论】:

    【解决方案2】:

    因为你的论点在这两种方法中都匹配 你应该告诉什么是 int 什么是 double 2 是有效的 double 和 int

    试试看

    calcAve((int)2,(double)3);
    

    【讨论】:

      【解决方案3】:

      在 java 中,如果您将 Integer 值作为参数传递,您可以简单地传递它,编译器会将这个整数值编译为 32 位 int 值。如果要将 Long 值作为参数传递,则必须在值的末尾添加“L”,例如 200L。然后编译器将其编译为 64 位长值。

      通常浮点值编译为双精度值。如果你想传递一个双精度值作为参数,你可以简单地将它传递为 200。然后编译器编译为 64 位双精度值。如果要将浮点值作为参数传递,则必须在值的末尾添加“F”,例如 200F。然后编译器将其编译为浮点值(32位)

      在您的情况下,两个参数列表都与参数列表兼容。这就是为什么编译器无法识别确切的原因。

      如果将双精度值作为 2.0 传递,则可以执行要执行的方法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-15
        • 1970-01-01
        • 2010-09-27
        相关资源
        最近更新 更多