java虛擬機(八)語法糖

語法糖可以看成是編譯器實現的一些功能。他們幫我們程序員特高代碼開發效率。

如泛型:

泛型擦除前

public static void main(String[] args) {
	Map<String, String> map = new HashMap<String, String>();
	map.put("hello", "你好");
	map.put("how are you?", "吃了沒?");
	System.out.println(map.get("hello"));
	System.out.println(map.get("how are you?"));
}

擦除後:

public static void main(String[] args) {
	Map map = new HashMap();
	map.put("hello", "你好");
	map.put("how are you?", "吃了沒?");
	System.out.println((String) map.get("hello"));
	System.out.println((String) map.get("how are you?"));
}

可以看到,泛型類型都變回了原生類型

所以可以知道List<String> 和List<Integer>的原生類型是一樣的。都是List<E>

那如果方法重載的時候,怎麼區分呢?

public class GenericTypes {

    public static void method(List<String> list) {
        System.out.println("invoke method(List<String> list)");
    }

    public static void method(List<Integer> list) {
        System.out.println("invoke method(List<Integer> list)");
    }
}

這是會報錯的。因爲這兩個方法的返回類型,和輸入類型都是一模一樣的。

但是如果,改變返回類型。

public class GenericTypes {

    public static String method(List<String> list) {
        System.out.println("invoke method(List<String> list)");
        return "";
    }

    public static int method(List<Integer> list) {
        System.out.println("invoke method(List<Integer> list)");
        return 1;
    }

    public static void main(String[] args) {
        method(new ArrayList<String>());
        method(new ArrayList<Integer>());
    }
}


就能輸出

invoke method(List<String> list)

invoke method(List<Integer> list)

這是通過返回參數不同。

有人有疑問了。方法重載要求方法具備不同的特徵簽名,但是特徵簽名卻不包括返回值。

不過在class文件格式中,只要描述符不完全一樣。比如返回值不一樣不同。就能共存在一個class文件之中。

當然,泛型的引入也對虛擬機做出了很多改變。有個屬性能保存的參數類型並不是原生類型。

再來個例子

public static void main(String[] args) {
	List<Integer> list = Arrays.asList(1, 2, 3, 4);
	// 如果在JDK 1.7中,還有另外一顆語法糖 ,
	// 能讓上面這句代碼進一步簡寫成List<Integer> list = [1, 2, 3, 4];
	int sum = 0;
	for (int i : list) {
		sum += i;
	}
	System.out.println(sum);
}

解語法糖後

public static void main(String[] args) {
	List list = Arrays.asList( new Integer[] {
		 Integer.valueOf(1),
		 Integer.valueOf(2),
		 Integer.valueOf(3),
		 Integer.valueOf(4) });

	int sum = 0;
	for (Iterator localIterator = list.iterator(); localIterator.hasNext(); ) {
		int i = ((Integer)localIterator.next()).intValue();
		sum += i;
	}
	System.out.println(sum);
}

 

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