PSR*_*PSR 19 java overload-resolution
public class Yikes {
public static void go(Long n) {
System.out.print("Long ");
}
public static void go(Short n) {
System.out.print("Short ");
}
public static void go(int n) {
System.out.print("int ");
}
public static void main(String[] args) {
short y = 6;
long z = 7;
go(y);
go(z);
}
}
Run Code Online (Sandbox Code Playgroud)
该程序正在提供输出
int Long
Run Code Online (Sandbox Code Playgroud)
我以为输出是
short Long
Run Code Online (Sandbox Code Playgroud)
这是什么原因?
man*_*uti 17
- 第一阶段(§15.12.2.2)执行重载解析而不允许装箱或拆箱转换,或使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第二阶段.
这保证了在Java SE 5.0之前在Java编程语言中有效的任何调用都不会因为引入变量arity方法,隐式装箱和/或取消装箱而被认为是不明确的.但是,变量arity方法(第8.4.1节)的声明可以更改为给定方法方法调用表达式选择的方法,因为变量arity方法在第一阶段被视为固定arity方法.例如,
m(Object...)在已经声明的类中声明不再为某些调用表达式选择m(Object)原因m(Object)(例如m(null)),m(Object[])更具体地说.
- 第二阶段(§15.12.2.3)执行重载解析,同时允许装箱和拆箱,但仍然排除使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第三阶段.
在第一阶段,编译器不在go(Short n)其解析中包含该方法.相反,它认为go(int n)是一种适用的方法.此方法适用,因为a short是加宽转换为int.
尝试一下这个:
代替
public static void go(Short n) {
System.out.print("Short ");
}
Run Code Online (Sandbox Code Playgroud)
尝试
public static void go(short n) {
System.out.print("Short ");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
816 次 |
| 最近记录: |