泛型方法与桥方法

简介:   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;
    }
}

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

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  多谢合作。

  

    

目录
相关文章
|
API C#
C#反射与特性(三):反射类型的成员
C#反射与特性(三):反射类型的成员
252 0
|
2月前
|
存储 编解码 开发框架
【C++ 多态 】了解 C++ 中的类型擦除和虚拟函数调用
【C++ 多态 】了解 C++ 中的类型擦除和虚拟函数调用
53 1
|
4月前
泛型是什么?有什么作用
当我们定义一个变量不确定类型的时候有两种解决方式
19 0
泛型是什么?有什么作用
|
8月前
|
弹性计算 JavaScript 开发工具
对象和接口-3:接口类型
本实验将介绍TypeScript中的接口类型
110 0
|
9月前
|
Java
Java面向对象 接口(interface)的详解
Java面向对象 接口(interface)的详解
55 0
普通类,抽象类和接口之间的区别
普通类,抽象类和接口之间的区别
|
Java
抽象类和接口的区别(通俗易理解)
抽象类和接口的区别(通俗易理解)
478 0
C#编程-108:调用泛型方法
C#编程-108:调用泛型方法
C#编程-108:调用泛型方法
|
Java C#
利用实例巧妙区分“抽象方法”和“虚方法”!
利用实例巧妙区分“抽象方法”和“虚方法”!
119 0
|
存储 C#
艾伟:C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
1.C#类和接口的区别 接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念! 而类是负责功能的具体实现! 在类中也有抽象类的定义,抽象类与接口的区别在于: 抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。
1128 0