加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Java泛型方法与桥技巧

发布时间:2021-12-10 15:08:43 所属栏目:PHP教程 来源:互联网
导读:Java泛型中有存在一种方式叫做类型擦除,也就是说泛型在编译期间进行类型检验上做到有效安全,但是在运行当中,会将该泛型类型用顶层父类(若无继承关系则用Object)代替,然后再进行强转换成目标类型,这种类型擦除也存在在泛型方法中,但是方法的擦除带来了
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;
    }
}
 
然而令人奇怪的是,由于类型擦除导致的还有另外一个从ParentString继承来的setSrc方法,即 setSrc(Object String)。
 
  由于参数的类型不同,这是两个不同的方法,但是这种情况不应该出现的。考虑一下下面的语句序列
 
    ChildString childString=new ChildString();
        ParentString<String> parentString=childString;
        parentString.setSrc("aaa");
 
  这里在一般的情况下是通过多态的关系,parentString引用了子类ChildString的方法,问题在于类型擦除与多态发生了冲突。要解决这个问题,就需要在ChildString中生成一个桥方法(bridge method)
 
 public void setSrc(Object src){
        setSrc((String)src);
    }
 
  值得注意的还有一点,桥方法不仅用于泛型类型,目的是用来被合成保持多态。在一个方法覆盖另一个方法时可以指定一个更严格的返回类型。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读