重載可變參數列表 , 可能會出現的問題!

如果我們重載可變參數列表,乍一看會覺得很安全。但是卻存在着隱患:如果不傳入參數,那麼編譯器就不知道要調用哪一個參數列表了,例如:

	static void f(Character...args) {
		for(Character c:args) {
			System.out.println(c);
		}
	}
	static void f(Integer...args) {
		for(Integer c:args) {
			System.out.println(c);
		}
	}
	static void f(Double...args) {
		for(Double c:args) {
			System.out.println(c);
		}
	}
	static void f(Long...args) {
		for(Long c:args) {
			System.out.println(c);
		}
	}
	public static void main(String[] args) {
		f('1','a');
		f(1);
		f(1,2);
		f(0.0D);
		f(0L);
		//如果我們傳入一個空的參數,編譯器就無法知道應該調用哪一個方法了。儘管這個方法可以弄清楚,但是它可能會使客戶端程序員大感意外。
		//f();
	}

我們可能會使用添加一個可變參數來解決問題:

	static void f(float q,Character...args) {
		for(Character c:args) {
			System.out.println(c);
		}
	}
	static void f(Integer...args) {
		for(Integer c:args) {
			System.out.println(c);
		}
	}

但是還是會出現問題,如果給兩個方法都添加一個非可變參數(不同類型的),就可以解決問題了。

	static void f(float q,Character...args) {
		for(Character c:args) {
			System.out.println(c);
		}
	}
	static void f(char q,Integer...args) {
		for(Integer c:args) {
			System.out.println(c);
		}
	}
	

總結: 你應該只是在重載方法的一個版本上使用可變參數列表,或者壓根就不使用它!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章