如下代码编译无法通过:

classA{}class B extendsA {}public static void funC(ListlistA) {//...

}public static void funD(ListlistB) {

funC(listB);//...

}

Unresolved compilation problem: The method doPrint(List) in the type test is not applicable for the arguments (List)

而下面的代码就没问题:

public static voidfunC(A a) {//...

}public static voidfunD(B b) {

funC(b);//...

}

在第二段代码中,类型B的实例向上转换成类型A的实例传入函数funC(A a),这是正常的隐式类型转换。而第一段代码则表明类型List的实例无法转换成类型List的实例。这就引出了Java泛型的类型转换问题。

Java是在JDK 5中引入的泛型(generics)新特性的。最主要的应用是在JDK 5中的新集合类框架中。可以解决之前的集合类框架在使用过程中出现的运行时刻类型错误,把问题暴露在编译中。但是为了保证与旧版本的兼容性,Java泛型的实现采用了类型擦除的机制,带来了一些缺陷。Java泛型的分析参考:http://www.infoq.com/cn/articles/cf-java-generics/。

Java泛型的实现:类型擦除

以上问题在C++中不会出现,这是两种语言的泛型实现机制不同造成的。

C++中的泛型类或方法,编译器会自动检查实例化的参数类型,然后根据类型检查参数类型的调用是否合理。如下代码能很好说明这个问题,模板在定义时并不对参数类型T的操作提前限制,等模板实例化时会根据T的具体类型检查操作是否合理。

template classManipulator {

T obj;public:

Manipulator(T x) {obj=x; }voidmanipulate() {obj.f(); }

};classHasF {voidf() {//...

}

};intmain() {

HasF hf;

Manipulatormanipulator(hf);

manipulator.manipulate();

}

Java采用的是所谓的“擦除”机制。在编译时不考虑传入的类型,把该类型的印迹全部擦除,视该类型为最基本的Object类型。但是Java会在编译时检查泛型接口传入的类型参数的实例是否存在隐含的转换情况,为了安全,泛型禁止此类转换。这就是开始我们遇到的问题,编译器检测到需要把List实例转换成List实例,这是被禁止的。明明可以实现的类型转换却被禁止,原因是编译时把类型参数擦除,当做Object,在运行时还要把Object类型的实例转换成类型参数的实例,两次转换存在运行时错误的风险。

为了解决泛型中隐含的转换问题,Java泛型加入了类型参数的上下边界机制。 extends A>表示该类型参数可以是A(上边界)或者A的子类类型。编译时擦除到类型A,即用A类型代替类型参数。这种方法可以解决开始遇到的问题,编译器知道类型参数的范围,如果传入的实例类型B是在这个范围内的话允许转换,这时只要一次类型转换就可以了,运行时会把对象当做A的实例看待。

引入上边界使Java泛型具有了像C++泛型那样在模板中调用类型参数的方法的能力。如下Java代码,实现了上面C++代码同样的功能:

class Manipulator{

T hf;public:

Manipulator(T t) {hf=t; }voidmanipulate() {hf.f(); }

};

java 泛型转换_Java泛型—类型转换相关推荐

  1. java强制转换_java强制类型转换

    在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toString(),(String)要转换的对象,St ...

  2. java泛型特点_java泛型简单总结

    Java泛型简单总结 1)基本概念: 泛型(Generic Type或Generics)是 对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看做是使用参数化类型时 ...

  3. java 泛型示例_Java泛型示例教程–泛型方法,类,接口

    java 泛型示例 Java Genrics is one of the most important features introduced in Java 5. Java Genrics是Java ...

  4. java泛型优点_java泛型的作用和好处

    转载于:https://blog.csdn.net/u012760183/article/details/52092692 之前参加面试的时候遇到面试官问泛型的作用,只是说了大概自己的理解, 在此转载 ...

  5. 泛型java 代码讲解_Java泛型详解

    2516326-5475e88a458a09e4.png 一,打破砂锅问到底 泛型存在的意义? 泛型类,泛型接口,泛型方法如何定义? 如何限定类型变量? 泛型中使用的约束和局限性有哪些? 泛型类型的继 ...

  6. java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等

    java泛型方法 通配符 泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 将泛型与集合类一起使 ...

  7. java泛型面试_Java泛型面试问题

    java泛型面试 Java面试中的通用面试问题在相当长的时间内在Java 5周围越来越普遍,许多应用程序都转移到Java 5上,并且几乎所有新的Java开发都发生在Tiger(Java 5的代号)上. ...

  8. java泛型 包_Java泛型应用浅析

    Java泛型应用浅析 Java泛型,饿,这个东西吗,嚼一下还是有必要的.有啥用呢?小弟曾觉着吧,吹牛是条不错的出路,但没一次没有不吹破的.(绕吧^_^) 详解呢,没啥必要了,参见附件解压后Java泛型 ...

  9. java泛型 初始化_Java泛型详解

    概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有 ...

最新文章

  1. 关于新技术的引入原则 ——从零开始学架构
  2. nat模式物理机ping不通虚拟机
  3. Nature Method :Rob Knight发布Striped UniFrac算法轻松分析微生物组大数据
  4. STL之nth_element__寻找第n大的元素
  5. javaweb学习总结(三十四)——使用JDBC处理MySQL大数据
  6. WPF 用Popup做下拉菜单
  7. python---Socket编程
  8. 数字化工厂的五大系统_如何搭建以MES系统为核心的数字化工厂?
  9. idea报错命令行过长
  10. Spring Bean的加载过程以及一些生命周期
  11. AI-终极算法-遗传算法
  12. 约瑟夫环(Data structure and algorithm -C language)—— #YU
  13. Mac苹果电脑怎么快速切换应用?
  14. Android system_server无法访问sdcard目录问题记录(Android 4.4 mtk平台)
  15. 转载HTMl转义字符大全
  16. 国家基金申请书中的科学问题与关键问题
  17. TP-WR842N虚拟服务器设置,TP-Link WR842N无线路由器怎么设置无线桥接
  18. JAVA入门————API(常用API)
  19. aws lambda使用_使用AWS Lambda,无服务器框架和Go的按需WebSockets
  20. 上班防摸鱼插件(知乎页面)

热门文章

  1. 10天企业框架培训笔记
  2. UE5入门第二周总结:基于蓝图的国际象棋的实现
  3. ElasticSearch 布尔查询
  4. 你真的懂 Unicode 和 UTF-8 是什么关系吗?来看看这个就彻底懂了!
  5. mac php开发套件_mac php集成开发环境搭建软件推荐(附教程)
  6. popstate_图解用HTML5的popstate如何玩转浏览器历史记录
  7. 真无线蓝牙耳机哪个牌子性价比高?千元内真无线耳机推荐
  8. linux怎么允许3306端口通过防火墙,Centos7允许3306端口通过防火墙
  9. DNS域名解析简要介绍
  10. 一个四年 JAVA 程序员的工作经历