首页 > 代码库 > 泛型方法与桥方法
泛型方法与桥方法
Java泛型中有存在一种方式叫做类型擦除,也就是说泛型在编译期间进行类型检验上做到有效安全,但是在运行当中,会将该泛型类型用顶层父类(若无继承关系则用Object)代替,然后再进行强转换成目标类型,这种类型擦除也存在在泛型方法中,但是方法的擦除带来了两个复杂的问题。
public class ParentString<String> { String src; public void setSrc(String src){ this.src=http://www.mamicode.com/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); }
值得注意的还有一点,桥方法不仅用于泛型类型,目的是用来被合成保持多态。在一个方法覆盖另一个方法时可以指定一个更严格的返回类型。
转载请说明原文出处:http://www.cnblogs.com/xxzhuang/p/5968331.html 多谢合作。
泛型方法与桥方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。