给定这段代码:
class Overloading
extends Object
{
static public void target(Object val, String chk) { System.out.println("Object["+val+"] :: Should be "+chk); }
static public void target(String val, String chk) { System.out.println("String["+val+"] :: Should be "+chk); }
static public void main(String[] args) {
Object obj=null;
target(null ,"Object");
target((Object)null,"Object");
target(obj ,"Object");
}
}
输出(出乎意料地)如下:
String[null] :: Should be Object
Object[null] :: Should be Object
Object[null] :: Should be Object
问题出在第一行,我希望它与其他两行相同。此外,我发誓直到最近,编译器还会给我一个普通 null
调用的模糊调用警告。然而,使用 Java 5 和 6 进行编译和测试会产生相同的结果。
这对我来说是一个重要问题,因为我有很多代码使用这种模式,即使用不同类型的重载“默认”参数来选择返回类型并推断所需的转换/解析。谁能解释一下这是怎么回事?
最佳答案
Java 一直以相同的方式工作:始终选择“最具体”的适用重载。由于 String
是 Object
的子类,因此它“更具体”,因此选择了 String
重载。如果重载是为了 String
和 Integer
,并且您试图传递 null
,那么您确实会遇到编译时歧义错误,因为它们都处于同一继承层次结构的同一级别。
关于java - 带有 null 的方法重载选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7198927/