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)
答案 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
,并且没有从int
到short
的正常隐式转换。现在你可以写:
short x = 5;
...因为它位于assignment context,其中有额外的转化:
此外,如果表达式是类型为
byte
,short
,char
或int
的常量表达式(第15.28节):
- 如果变量的类型是
byte
,short
或char
,则可以使用缩小的基元转换,并且常量表达式的值可以在类型中表示。变量
然而,这不适用于方法参数。
一旦你得到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 considered为int
。
因此,除非您将其指定为short
(例如通过强制转换),否则就编译器而言,它是sum(int i,int j)
的调用。