java向重载方法传递null
我对以下两个程序的输出感到困惑
当我在程序1中只有两个参数为String
和Object
的方法时,它会给我输出为String
但是,当我在程序2中添加一个参数为Integer
的新方法时,它不会编译,并给出错误信息
方法nullTest(对象)对于类型testNull不明确
程序1:
package onkartest;
public class TestNull {
public static void nullTest(Object b)
{
System.out.println("object");
}
public static void nullTest(String x)
{
System.out.println("String");
}
public static void main(String x[])
{
nullTest(null);
}
}
输出:字符串
程序2:
package onkartest;
public class TestNull {
public static void nullTest(Object b)
{
System.out.println("object");
}
public static void nullTest(String x)
{
System.out.println("String");
}
public static void nullTest(Integer i)
{
System.out.println("Integer ");
}
public static void main(String x[])
{
nullTest(null);
}
}
输出:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method nullTest(Object) is ambiguous for the type testNull
at onkartest.testNull.main(testNull.java:26)
而且,如果我运行程序时只保留Object
参数方法,它会将输出作为Object
你能解释一下这种行为背后的原因吗
# 1 楼答案
当尝试将参数传递给方法时,它首先尝试完全相同的类型。如果没有,那就试着直接使用超级类型。在第一个程序中,对象大于字符串,所以它与字符串匹配。但在第二个程序中,对象类在同一级别上有两个子类,所以java编译器无法找到哪一个子类要映射空值
# 2 楼答案
在决定使用哪个函数时,Java将尝试查找具有最具体输入参数的函数。因此,在第一种情况下,字符串函数被选择为null,可以分配给字符串。对象是字符串的父对象,因此字符串函数将更加具体
在第二种情况下,Integer和String都是从Object继承的,并且都可以指定为null。因此,这两个函数都是同样特定的,Java无法决定使用哪一个函数