0

このリンクを通過しました。しかし、私は次のサンプルコードと混同しています:-

public class NullTest {

   public static void method(Object obj){
     System.out.println("method with param type - Object");
   }

   public static void method(String str){
     System.out.println("method with param type - String");
   }

   public static void method(StringBuffer strBuf){
     System.out.println("method with param type - StringBuffer");
   }

   public static void main(String [] args){
     method(null); //... compile-time error!
   }
}

私が得ているエラーは:-

ankit@stream:/home/Data/JAVA/practice$ javac trickyMethodOverloading.java 
trickyMethodOverloading.java:16: error: reference to method is ambiguous, both method method(String) in trickyMethodOverloading and method method(StringBuffer) in trickyMethodOverloading match
     method(null); //... compile-time error!

何か提案があればお願いします

4

2 に答える 2

2

すべてのメソッドに同じ名前が付いています。Java が現在それらを区別できる唯一の方法は、受け取った引数によって、どちらを使用するかを知ることです。ただし、使用nullしても何も絞り込まれないため、コンパイラはどれを使用するかがわからないため、コンパイルを終了できません。

于 2012-10-28T17:31:49.687 に答える
1

このようなメソッドのオーバーロードの場合、使用されるクラスが継承ツリーの同じブランチに属している限り、最も具体的なメソッド、つまり継承ツリーの階層の最も深いクラスに属するメソッドが実行時に選択されるため、あいまいさなしに 1 つのクラスを見つけることができます。(Javaドキュメントからではなく、私自身の理解から:))

ただし、あなたの例では、それぞれ String と StringBuffer を持つ 2 つのオーバーロードされたメソッドがあり、継承ツリーの同じブランチに属していません。これが、コンパイラが不平を言っている理由です。継承のさまざまな分岐 継承ツリーの同じブランチ

この種の例は、たとえば、B が A を拡張し、C が B を拡張する 3 つのクラス A、B、C の階層がある場合に機能します。

public class NullTest{

   public static void method(A a){
     System.out.println("method with param type - A");
   }

   public static void method(B b){
     System.out.println("method with param type - B");
   }

   public static void method(C c){
     System.out.println("method with param type - C");
   }


   public static void main(String [] args){
     method(null);// compiles successfully and will print- "method with param type - C"
   }
}

これは、A、B、および C が継承ツリーの同じ階層に属しているためです。したがって、コンパイラは単純に最も深いレベルに移動しようとし、あいまいさのない単一のクラス (この場合は C) を見つけることができます。また、コードから String または StringBuffer のいずれかを削除すると、機能します。

于 2012-11-06T14:19:14.973 に答える