函数重载未解决的例子

时间:2015-09-16 06:03:15

标签: java overloading

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在短的范围内,而我是像这样的类型转换r.sum(Short(5),5 );然后是调用sum(short i,int j)

3 个答案:

答案 0 :(得分:2)

这不是过载解决的问题 - 使用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规则的更具体的方法。

答案 1 :(得分:0)

如果指定两个方法

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

现在,如果您致电sum(12.12,4),则会调用sum(double i,int j)。因为实际值或十进制值在java中是double类型。要调用sum(short i,int j)需要另外通过类型指定将其转换为简短。

sum(short(12.23),4) 

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

答案 2 :(得分:-1)

在java文字整数中,implicitly consideredint

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