【发布时间】:2019-02-12 12:07:09
【问题描述】:
public class WrapperClasses{
void overloadedMethod(Number N){
System.out.println("Number Class Type");
}
void overloadedMethod(Double D){
System.out.println("Double Wrapper Class Type");
}
void overloadedMethod(Long L){
System.out.println("Long Wrapper Class Type");
}
public static void main(String[] args){
int i = 21;
WrapperClasses wr = new WrapperClasses();
//wr.overloadedMethod(i);
}
}
class mine extends WrapperClasses{
void overloadedMethod(int N){
System.out.println("Integer Class Type");
}
public static void main(String[] args){
int i = 21;
WrapperClasses wr = new mine();
wr.overloadedMethod(i);
}
}
这打印Number Class Type。
我了解包装类方法重载的规则:
- 如果您将原始数据类型作为参数传递给方法 调用时,编译器首先检查一个方法定义,该定义采用 与参数相同的数据类型。
- 如果这样的方法不存在,那么它会检查一个方法 采用比传递的更大的原始数据类型的定义 数据类型。即,它尝试对 传递的数据类型。
- 如果无法进行自动加宽转换,则会检查是否存在 方法定义,它将相应的包装类类型作为 争论。即,它会尝试执行自动装箱转换。
- 如果这样的方法不存在,那么它会检查一个方法 将超类类型(数字或对象类型)作为参数。
- 如果这样的方法也不存在,那么编译器会给出一个 编译时错误。
根据规则1,它应该打印Integer Class Type。我在这里错过了什么?
【问题讨论】:
-
它签入1指定的类WrapperClasses或wr。编译器不会(不需要)努力研究 wr 实际上是什么类。在
WrapperClasses wr = System.millis() % 2 == 0? new WrapperClasses() : new mine();,这可能会变得无法解决。 -
编译时接线。
标签: java wrapper autoboxing