6

当我运行此代码时,它会打印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);    
   }
}
4

4 回答 4

3

这个答案

在那里,您会注意到这是一个编译时任务。JLS 在第 15.12.2 小节中说:

此步骤使用方法的名称和参数表达式的类型来定位既可访问又适用的方法。这样的方法可能不止一种,在这种情况下,选择最具体的一种

于 2013-03-06T12:31:29.550 回答
2

编译器将查看可能与您传递的参数匹配的方法的所有可能重载。如果其中一个比所有其他的更具体,那么它将被选择,如果没有一个最具体的重载,它只会被认为是模棱两可的。

在您的示例中,有两个可能的重载,method1(Object)并且method1(String). 由于StringObject没有歧义更具体,因此String将选择该选项。如果存在第三个重载,例如method1(Integer)then 就不再有一个最具体的 call 选择method1(null),编译器会产生错误。

于 2013-03-06T12:40:16.560 回答
0

好在一句话

在重载方法的情况下,编译器选择具有最具体类型的方法,因为 String 是最具体的类型,Object 编译器将调用以字符串为参数的方法

于 2013-03-06T12:31:20.177 回答
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 所以它将对象作为参数传递

于 2013-03-06T12:44:13.397 回答