JAVA関数のリロードと精度マッチング


最近ひとつのJAVAが困惑の重荷を解くケースを见て、とても面白いと感じて、みんなが分かるかもしれないことを言い出しますが、しかし时には、“间违いを犯す”かもしれません.
    まず、次のコードの出力を考慮します.
public class JavaPuzzles {
	public static void main(String[] args) {
		JavaPuzzles.printObj(null);
	}
	
	public static void printObj(double[] array){
		System.out.print("double array");
	}
	
	public static void printObj(Object obj){
		System.out.println("Object");
	}
}

    出力結果:double array ,分析してみましょう.JAVA関数のリロード呼び出しは、一般的に2つのステップに分けられます.
    1、使用可能なすべてのメソッドまたはコンストラクタを見つけます.上記の例から、double[]とObjectの2つのパラメータタイプを見つけました.
    2、パラメータタイプに応じて1から最も正確なメソッドまたはコンストラクタを選択して呼び出す.nullについては,そのタイプを事前に決定することはできず,両関数とも条件を満たし,配列もObjectから継承されるためdouble[]はObjectよりも精度が高く,出力結果はdouble arrayとなる.   さらに考慮すると、
public class JavaPuzzles {
	public static void main(String[] args) {
		JavaPuzzles.printObj(null); //          
	}
	
	public static void printObj(double[] array){
		System.out.print("double array");
	}
	
	public static void printObj(Number number){
		System.out.print("number");
	}
	
	public static void printObj(Object obj){
		System.out.println("Object");
	}
}

リロード関数を呼び出すと、コンパイルできます.呼び出した場合はコンパイルできません.ヒント:
The method printObj(double[]) is ambiguous for the type JavaPuzzles.
どうして?コンパイル時にnullがどのようなタイプなのか、Numberとdoubl[]がObjectから継承されているのか、まったく区別できないため、コンパイルエラーが発生しました.
そこで,このような事前に明確なタイプのパラメータリロード呼び出しは,親子または多層継承関係でのみ起こり得るが,兄弟または兄弟子孫間では起こり得ないことが分かった.
たとえば、StringはObjectから継承され、DoubleはObject-->Numberから継承されるため、null呼び出し時にコンパイルエラーが表示されます.
	public static void printObj(Double dbl){
		System.out.print("double");
	}
	
	public static void printObj(String string){
		System.out.println("string");
         }
DoubleはNumberから継承されているのでnullを呼び出すと、より精度の高い関数、すなわちdoubleが入力されます
	public static void printObj(Double dbl){
		System.out.print("double");
	}
	
	public static void printObj(Number number){
		System.out.println("number");
	}
解関数の再ロードは多くの便利さをもたらしたが、注意しない場合、望ましくない結果をもたらす可能性があり、このような問題を回避すれば、呼び出し時にパラメータの正確なタイプを明確にし、問題を回避することができる.のように
JavaPuzzles.printObj((Number)null);