当我运行此代码时,它会打印String
。我的问题是为什么没有编译时错误?
Object的默认值以及String为null。那么编译器为什么不说Reference to method1 is ambiguous
。
public class Test11
{
public static void method1(Object obj) {
System.out.println("Object");
}
public static void method1(String str) {
System.out.println("String");
}
public static void main(String[] arr ) {
method1(null);
}
}
答案 0 :(得分:3)
来自this answer:
在那里,您会注意到这是一个编译时任务。 JLS在第15.12.2小节中说:
此步骤使用方法的名称和参数表达式的类型来定位可访问和适用的方法可能有多个这样的方法,在这种情况下选择最具体的方法强>
答案 1 :(得分:3)
编译器将查看可能与您传递的参数匹配的方法的所有可能重载。如果其中一个比其他所有更具体,那么它将被选中,如果没有单个最具体的过载,则只会被认为是不明确的。
在您的示例中,有两种可能的重载,method1(Object)
和method1(String)
。由于String
比Object
更具体,因此不存在歧义,并且将选择String
选项。如果存在第三个重载,例如method1(Integer)
,则调用method1(null)
不再有一个最具体的选择,编译器会生成错误。
答案 2 :(得分:0)
一句好话
如果重载方法编译器选择最多的方法 特定类型,因为String是Object编译器中最具体的类型 将调用以字符串作为参数的方法
答案 3 :(得分:0)
public class Test11
{
public static void method1(String str)//here str is the object of string
{
System.out.println("String");
}
public static void method1(Object obj)//here this is a common object not specified
{
System.out.println("Object");
}
public static void main(String[] arr )
{
Test11 t=new Test11();
String null1=new String();
method1(null1);
method1(t);
}
}
output is :
String
Object
// null1-是一个字符串对象,如果你通过它,它只会调用method1(String str)因为你传递字符串对象 // t-是一般对象,如果你通过它,它将只调用method1(Object obj),因为你传递类objct所以它将对象作为参数传递