Java引數過載帶來的疑惑

小弟季義欽發表於2012-11-04
package someTest;

class SSSuperClass{}
class SSSubClass extends SSSuperClass{}

public class TestDuplicate {

	public void function(Object o){				//方法1
		System.out.print("Object\n");
	}
	
	public void function(int[] array){			//方法2
		System.out.print("int[] array\n");
	}
	
	public void function(SSSuperClass array){	//方法3
		System.out.print("SSSuperClass\n");
	}
	
	public void function(SSSubClass array){		//方法4
		System.out.print("SSSubClass\n");
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new TestDuplicate().function(new Object());			//呼叫1
		new TestDuplicate().function(new int[3]);			//呼叫2
		new TestDuplicate().function(new SSSubClass());		//呼叫3
		new TestDuplicate().function(new SSSuperClass());	//呼叫4
		/**
		 * 一切都看似很和諧。引數過載可以允許父類和子類關係的存在,
		 * 呼叫的時候會根據實際的引數,尋找最為精確匹配的那個函式去執行。
		 * 如果我們去掉方法4,呼叫4就會發現方法3才是它最匹配的函式,所以呼叫之。
		 * 如果去掉方法3,呼叫4會發現方法1才是自己的實參最匹配的函式,所以呼叫之。
		 * */
		
		/**
		 * 但是如果我們傳入的不是陣列,也不是任何物件,而是一個null呢???
		 * 同樣null也會找一個最為精確匹配的函式,但是這裡會編譯錯誤。因為這邊有兩條繼承
		 * 路徑,一個是Object->array[],一個是Object->SSSuperClass->SSSubClass。
		 * 所以方法2和方法4,null就不知道哪個才是最精確的匹配了。
		 * 所以我們方法3和方法4在下面的呼叫下不相容,有歧義。
		 * */		
		//new TestDuplicate().function(null);	//compile error
		
		//可以看到null雖然是物件,但是卻什麼都不是,甚至連Object都不是,但是他依然會尋找最為匹配的形參
		String s = null;
		String ss = "sss";
		if(s instanceof String) System.out.print("s is String");
		if(ss instanceof String) System.out.print("ss is String");
		if(null instanceof Object) System.out.print("null is a Object");
	}
}

相關文章