java泛型

一、实现机制
java泛型实现方法为类型擦除,基于这种方法实现的泛型称为伪泛型。
java泛型只在源代码中存在,在编译后的文件中替换为原生类型,并插入强制转换。
(真正的泛型是应该存在于源码、编译后文件、运行期)

二、擦除实例
源码:
List<String> testList = new ArrayList<String>();
testList.add("abcd");
System.out.println(testList.get(0));
编译后:
List<String> testList = new ArrayList();
testList.add("abcd");
System.out.println((String)testList.get(0));

三、重载实例(1)
源码:
private void overLordTest(List<String> list) {
    System.out.println(list.size());
}
private void overLordTest(List<Integer> list) {
    System.out.println(list.size());
}
不能通过编译,因为编译后参数类型是一样的。

四、重载实例(2)
源码:
private String overLordTest(List<String> list) {
    return “overLordTest”;
}
private void overLordTest(List<Integer> list) {
    System.out.println(list.size());
}
可以通过编译并正常运行(有警告),与java返回值 不参与重载冲突?【用sun JDK1.6编译】
Class文件格式中,只要描述符不是完全一致的两个方法就可以共存。
用JDK1.7/JDK1.8编译报错,是否能运行与调用其中几个方法有关。

五、思考
真正泛型会是什么样?与多态有什么区别和联系?

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java 泛型详解

对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。本文参考java泛型详解、Java中的泛型方法、java泛型详解1\.概述泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。什么是泛型?为什么要使用泛型?泛型,即“参数化类型”。一提到参数,最熟

死磕Java泛型(一篇就够)

Java泛型,算是一个比较容易产生误解的知识点,因为Java的泛型基于擦除实现,在使用Java泛型时,往往会受到泛型实现机制的限制,如果不能深入全面的掌握泛型知识,就不能较好的驾驭使用泛型,同时在阅读开源项目时也会处处碰壁,这一篇就带大家全面深入的死磕Java泛型。泛型擦除初探相信泛型大家都使用过,所以一些基础的知识点就不废话了,以免显得啰嗦。

Gson通过借助TypeToken获取泛型参数的类型的方法

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下。由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)。但是有的时候