下面的兩段代碼,經(jīng)過編譯器的編譯后,產(chǎn)生的字節(jié)碼是一樣的,你敢信?。。?/strong>
public class SimpleHolder {
private Object obj;
public void set(Object obj) {
this.obj = obj;
}
public Object get() {
return obj;
}
public static void main(String[] args) {
SimpleHolder holder = new SimpleHolder();
holder.set("Item");
String s = (String) holder.get();
}
}
↑↑↑
上面的代碼
在調(diào)用 set() 的時候,并不做類型檢查,而在調(diào)用 get() 的時候才做類型檢查。就是當(dāng)離開 get() 方法的時候做檢查。
↑↑↑
public class GenericHolder<T> {
private T obj;
public void set(T obj) {
this.obj = obj;
}
public T get() {
return obj;
}
public static void main(String[] args) {
GenericHolder<String> holder = new GenericHolder<String>();
holder.set("Item");
String s = holder.get();
}
}
上面的代碼
在調(diào)用 set() 的時候,并不做類型檢查,因為擦除了。同樣在調(diào)用 get() 的時候才做類型檢查。
原書中還有一段很重要的話。
記住,“邊界就是發(fā)生動作的地方”