語法糖可以看成是編譯器實現的一些功能。他們幫我們程序員特高代碼開發效率。
如泛型:
泛型擦除前
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);
}