【问题标题】:function overloading unsolved example函数重载未解决的例子
【发布时间】:2015-09-16 06:03:14
【问题描述】:
public class Roshni {

    void sum(int i, int j) {
        System.out.println("inside 1st i = " + i);
    }
    void sum(short i, int j) {
        System.out.println("inside 2nd i = " + i);
    }

    public static void main(String s[]) {
        Roshni r = new Roshni();
        r.sum(5, 5);
    }
}

现在我的问题是为什么 sum(int i,int j) 被调用,即使第一个命令行参数 5 在 short 范围内,而我像这样 r.sum(Short(5),5 );然后它调用 sum(short i,int j)

【问题讨论】:

  • 当您提出问题时,请花时间格式化您的代码 - 如果缩进它会更易读。此外,如果没有第二个参数,并且如果 sumstatic 方法,该示例会更简单。
  • 谢谢约翰,会照顾好
  • @user4188607 - 谢谢乔恩:P
  • 我可以知道您为什么建议将 sum 方法保留为静态 Jon
  • 不需要它是非静态的,因为没有使用状态,并且您没有提到覆盖子类中的方法的要求。它只是避免了创建Roshni 的需要。

标签: java overloading


【解决方案1】:

这不是重载决议的问题——你的带有short 参数的方法甚至都不适用。这是一个例子:

public class Test {
    public static void foo(short x) {        
    }

    public static void main(String[] args) throws Exception {
        foo(5); // Error
    }
}

这会产生编译时错误:

Test.java:10: error: incompatible types: possible lossy conversion from int to short
        foo(5);
            ^

整型字面量的类型是int,从intshort 没有正常的隐式转换。现在你可以写:

short x = 5;

...因为它位于assignment context 中,可以进行其他转换:

此外,如果表达式是 byteshortcharint 类型的常量表达式 (§15.28):

  • 如果变量的类型是byteshortchar,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原语转换。

但是,这不适用于方法参数。

一旦你获得了short 类型的值,那么重载决议就会发挥作用:

short x = 5;
r.sum(x, 5);

现在这两种方法都适用,编译器会按照JLS 15.12.2.5的规则选择第二种方法作为更具体的方法。

【讨论】:

    【解决方案2】:

    如果你指定两个方法为

    sum(double i,int j)
    sum(short i,int j) 
    

    现在,如果您调用 sum(12.12,4),那么将调用 sum(double i,int j)。这是因为Java中的实数或十进制值是双精度类型的。要调用sum(short i,int j) 需要另外指定类型转换为short。

    sum(short(12.23),4) 
    

    这种类型转换为 short 将丢弃 12.23 的 64 位双精度值中的高阶位,仅选择最后 16 位作为短值。

    【讨论】:

      【解决方案3】:

      在 java 中,整数是 implicitly consideredints。

      因此,除非您将其指定为 short(例如通过强制转换),否则就编译器而言,它是对 sum(int i,int j) 的调用。

      【讨论】:

      • 任何人都可以判断我的第一个函数是 sum(double i,int j),第二个是 sum(short i,int j) 保持命令行参数与调用哪个函数相同跨度>
      猜你喜欢
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2019-04-09
      相关资源
      最近更新 更多