下面的两段代码,经过编译器的编译后,产生的字节码是一样的,你敢信!!!
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();
}
}
↑↑↑
上面的代码
在调用 set() 的时候,并不做类型检查,而在调用 get() 的时候才做类型检查。就是当离开 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();
}
}
上面的代码
在调用 set() 的时候,并不做类型检查,因为擦除了。同样在调用 get() 的时候才做类型检查。
原书中还有一段很重要的话。
记住,“边界就是发生动作的地方”