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
。我在这里缺少什么?
在语言规范级别,这是因为参数不同于原始类型和包装原始类型的方法不被视为覆盖等效项。 (一种奇特的说法是“他们只是不这样做,因为语言规范是这么说的”)。
但从逻辑上讲,他们也不应该这样做,至少在int
子类中的参数“覆盖”超类中的包装参数。
根据里氏替换原则,子类中的方法必须接受at least超类中的方法接受的所有参数。
如果超类方法接受包装类,它也可以接受null
。如果子类方法只允许接受int
,它不能接受 null,因此它是不可替代的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)