Java 函数重载未解决的示例

Java 函数重载未解决的示例,java,overloading,Java,Overloading,现在我的问题是,为什么即使第一个命令行参数5在short的范围内,sum(inti,intj)也会被调用,而当我像这样进行打字时,sum(short(5),5);然后它调用sum(短i,int j)在java中,文字整数为ints 因此,除非您指定它为short(例如通过强制转换),否则就编译器而言,它是对sum(inti,intj)的调用。这不是重载解析的问题-您使用short参数的方法甚至不适用。下面是一个例子: public class Roshni { void sum(int

现在我的问题是,为什么即使第一个命令行参数5在short的范围内,sum(inti,intj)也会被调用,而当我像这样进行打字时,sum(short(5),5);然后它调用sum(短i,int j)

在java中,文字整数为
int
s


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

这不是重载解析的问题-您使用
short
参数的方法甚至不适用。下面是一个例子:

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);
    }
}
这会产生编译时错误:

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

    public static void main(String[] args) throws Exception {
        foo(5); // Error
    }
}
整数文本的类型是
int
,没有从
int
short
的正常隐式转换。现在你可以写:

。。。因为这是在一个可以进行额外转换的

此外,如果表达式是
byte
short
char
int
类型的常量表达式(§15.28):

  • 如果变量的类型是
    字节
    字符
    ,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原语转换
但是,这不适用于方法参数

一旦获得类型为
short
的值,则重载解析将发挥作用:

short x = 5;

现在这两种方法都适用,如果您将两种方法指定为

short x = 5;
r.sum(x, 5);
现在,如果调用
sum(12.12,4)
,那么将调用
sum(double i,int j)
。这是因为实值或十进制值在java中是双重类型的。要调用
总和(short i,int j)
还需要通过将其转换为short来指定

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

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

当您提出问题时,请花时间格式化代码-如果缩进,代码的可读性会更好。此外,如果没有第二个参数,示例会更简单,如果
sum
是一个
静态方法care@user4188607-谢谢Jon:P我知道你为什么建议将求和方法保持为静态Jon它不需要是非静态的,因为没有使用状态,您还没有提到在子类中重写方法的要求。它只是避免了创建一个
Roshni
。任何主体都可以判断我的第一个函数是sum(double i,int j),第二个函数是sum(short i,int j),并保持命令行参数与调用哪个函数相同吗
sum(double i,int j)
sum(short i,int j) 
sum(short(12.23),4)