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

コンパイラは、渡されたパラメーターに一致する可能性のあるメソッドのすべてのオーバーロードを調べます。それらの 1 つが他のすべてよりも具体的である場合、それが選択されます。最も具体的なオーバーロードが 1 つもない場合にのみ、あいまいと見なされます。

あなたの例では、2 つの可能なオーバーロードmethod1(Object)method1(String). あいまいさがないStringよりも具体的であるため、オプションが選択されます。のような 3 番目のオーバーロードがあった場合、 call の最も具体的な選択肢は 1 つではなくなり、コンパイラはエラーを生成します。ObjectStringmethod1(Integer)method1(null)

于 2013-03-06T12:40:16.560 に答える
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- u がこれを渡す場合、文字列オブジェクトです u が文字列オブジェクトを渡すためのみ、method1(String str) が呼び出されます //t- u がこれを渡す場合は一般的なオブジェクトです。 object パラメーターとしてオブジェクトを渡すようにします

于 2013-03-06T12:44:13.397 に答える
0

まあ一文で

オーバーロードされたメソッドの場合、コンパイラは最も具体的なタイプのメソッドを選択します。これは、String がオブジェクトの最も具体的なタイプであるためです。コンパイラは、文字列を引数として受け取るメソッドを呼び出します。

于 2013-03-06T12:31:20.177 に答える