zoukankan      html  css  js  c++  java
  • 泛型方法与桥方法

      Java泛型中有存在一种方式叫做类型擦除,也就是说泛型在编译期间进行类型检验上做到有效安全,但是在运行当中,会将该泛型类型用顶层父类(若无继承关系则用Object)代替,然后再进行强转换成目标类型,这种类型擦除也存在在泛型方法中,但是方法的擦除带来了两个复杂的问题。

      

    public class ParentString<String> {
        String src;
        public void setSrc(String src){
            this.src=src;
        }
    }
    public class ChildString extends ParentString<String> {
        String s="childString";
        public void setSrc(String src){
            src=s;
        }
    }

      在类型擦除之后,代码演变成如下的样子

    public class ChildString extends ParentString {
        String s="childString";
        public void setSrc(String src){
            src=s;
        }
    }

      但是,由于类型擦除,父类中的方法变成

    setSrc(Object src)

      这个时候子类无法覆盖父类的方法。

      由于参数的类型不同,这是两个不同的方法,但是这种情况不应该出现的。考虑一下下面的语句序列

         ChildString childString=new ChildString();
            ParentString<String> parentString=childString;
            parentString.setSrc("aaa");

      这里在一般的情况下是通过多态的关系,parentString引用了子类ChildString的方法,问题在于类型擦除与多态发生了冲突。要解决这个问题,就需要在ChildString中生成一个桥方法(bridge method,编译器自动生成)

     public void setSrc(String src){
            setSrc((String)src);
        }

      值得注意的还有一点,桥方法不仅用于泛型类型,目的是用来被合成保持多态。在一个方法覆盖另一个方法时可以指定一个更严格的返回类型。

      还有另外一个知识点作为补充

      

      转载请说明原文出处:http://www.cnblogs.com/xxzhuang/p/5968331.html  多谢合作。

      

        

  • 相关阅读:
    maxContainerCapability 设置不足
    parquet code demo
    Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
    jvm 调优 工具
    hive premanent udf 发布...
    centos6.5 升级python 到 python 2.7.11 安装 pip
    mapreduce 关于小文件导致任务缓慢的问题
    数据可视化开源系统(python开发)
    vs 中 vim vax 快捷键
    ViEmu for VS2013-3.2.1 破解(转)
  • 原文地址:https://www.cnblogs.com/xxzhuang/p/5968331.html
Copyright © 2011-2022 走看看