java中的泛型
2019-11-12 16:08:48来源:博客园 阅读 ()
java中的泛型
本文将详细介绍java泛型的用法以及泛型的原理
java泛型
泛型是在J2 SE1.5中引入的一个特性 可以将类型抽象为一个参数 从而简化代码和实现类型安全
如何使用泛型
泛型可以用于方法 类和接口 通过尖括号加标识符的方式声明
class GenericityClass<T> { T t; public GenericityClass(T t) { this.t = t; } public T getT() { return t; } } interface GenericityInterface<T> { void printGenericity(T t); } public static <A> A test(A a) { System.out.println(a); return a; }
其中类型T是一个不确定的类型 需要填入实际类型才能使用
ps1: 可以给泛型参数起任意名称 例如 <T2333> <abcd> <FAN_XING>
ps2: 可以声明任意个泛型参数 不同的泛型参数用','隔开 例如 <T, E, TD250>
使用泛型类,方法与普通的类,方法并没有太大区别 除了要填入尖括号和类型
GenericityClass<String> gc = new GenericityClass<String>("泛型类测试"); String s = gc.getT(); Main.<String>test("泛型方法测试");
因为编译器推导的存在 我们可以省略一些重复的类型信息
GenericityClass<String> gc = new GenericityClass<>("泛型类测试");// 前边的<String>已经声明了类型 后边的就可以省略 String s = gc.getT(); Main.test("泛型方法测试");// 后边填入的参数String已经确定了泛型参数的类型 因此可以省略<String>
java泛型的实现原理
java的泛型实现机制并不是类似c++编译时模板生成 也不是c#运行时生成泛型类 而是利用了一套泛型擦除机制
通过观察编译后的字节码 我们发现 编译器将所有的泛型参数都处理成Object类型
class GenericityClass { Object t; public GenericityClass(Object t) { this.t = t; } public Object getT() { return t; } } interface GenericityInterface { void printGenericity(Object t); } public static Object test(Object a) { System.out.println(a); return a; }
GenericityClass gc = new GenericityClass("泛型类测试"); String s = (String) gc.getT();// 因为返回值是Object所以要强制转换 BlueBridge.test("泛型方法测试");
我们可以用反射来验证这一点 如果是泛型擦除 那么List<String>的实际类型应该是List<Object>
List<String> list = new ArrayList<>(); list.add("这是String"); list.add("这也是String"); list.add("这还是String"); try { List.class.getMethod("add", Object.class).invoke(list, (Object) new int[] {1, 2, 3}); } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { e.printStackTrace(); } for (Object obj : list) { System.out.println(obj); }
运行结果
这是String
这也是String
这还是String
[I@4554617c
于是我们在一个List<String>中成功插入了一个int数组
为什么java要使用泛型擦除机制来实现泛型
为了兼容旧版本代码
java的泛型是在J2 SE1.5中加入的 在此之前的通用容器都是将对象转为Object储存 List<T>编译后就成了List 完美兼容旧版本
但是这也带来了一些缺陷 泛型不能是基本类型 所有基本类型必须转为对应的包装类 例如List<Integer> 这个过程中产生了装箱 导致效率损失
听说之后版本的java会引入一些机制来解决基本类型装箱问题 但那可能得等到猴年马月了
END
原文链接:https://www.cnblogs.com/redstone-torch/p/11844553.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:简单排序算法之冒泡排序
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash