15.7.4 边界处的动作

下面的两段代码,经过编译器的编译后,产生的字节码是一样的,你敢信!!!

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() 的时候才做类型检查。


原书中还有一段很重要的话。
记住,“边界就是发生动作的地方”

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 边界处的动作 正因为泛型的擦除,泛型带来了一个事实,可以表示没有任何意义的事物,即可以表示没有任何意义的事物。 尽...
    呆呆李宇杰阅读 849评论 0 0
  • 编译器无法确定泛型的实际类型,但可以保证在使用泛型时的一致性;
    乌鲁木齐001号程序员阅读 251评论 0 0
  • 未完,待更新 一、必备题 1、AFN 原理 链接:AFNetworking源码——基本架构 - 简书 2、SDWe...
    小熊_07cb阅读 2,852评论 3 27
  • 面向对象的三大特征,并作简单的介绍。 面向对象的三个基本特征是:封装、继承、多态。 1.封装是面向对象的特征之一,...
    xiny123阅读 1,501评论 0 6
  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 5,042评论 0 13