Java泛型相关总结(下)
约束与局限性
不能用基本类型实例化类型参数
不能像Pair<double>这样调用,只能Pair<Double>,原因是类型擦除
运行时类型查询只使用于原始类型
虚拟机中的对象属于一个特定的非泛型类型,类型查询只能产生原始类型。
- Pair<String> stringPair = ...;
- Pair<Employee> employeePair = ...;
- if (stringPair.getClass() == employeePair.getClass()) //相等的
不能创建参数化类型的数组
因为类型擦除会导致数组元素类型不安全
不能创建数组,但可以声明类型为Pair<String>[]的变量
向可变参数方法传递泛型类型实例,虚拟机会创建泛型类型数组,且会提示一个警告,使用@SupressWarnings("unchecked")或@SafeVarargs标注。
不能实例化类型变量
不能使用 new T(...)、new T[...]、T.class这样的类型变量
不能构造泛型数组
这里有数组中的一个知识点,数组类型之间不能强制类型转换,当Object[]引用赋给Comparable[]变量时,将会发生ClassCastException异常
擦除导致的
在静态方法中,构造静态方法有两种方式:
1.让用户提供数组构造器方法
- public static <T extends Comparable> T[] minmax(IntFunction<T[]> constr, T... a) {
- T[] mm = constr.apply(2);
- ...
- }
2.使用反射
- private static <T extends Comparable> T[] minmax2(T... args) {
- T[] mm = (T[])Array.newInstance(args.getClass().getComponentType(), 2);
- ...
- }
不能在静态域、静态方法中引用类型变量
会有编译时错误
不能抛出或捕获泛型类的对象,泛型类扩展Throwable是不合法的
可以消除对受查异常的检查
擦除后的冲突,比如以下泛型方法在擦除后会与Object的equals()产生冲突
public boolean equals(T value) {
return first.equals(value);
}
补救的办法是重新命名引发错误的方法。
泛型的继承规则
无论S与T有什么关系,Pair<S>与Pair<T>没有什么关系,以下代码有编译错误
- Manager[] topHonchos = ...;
- Pair<Employee> result = ArrayAlg.minmax(topHonchos); //error
在数组中,可以将一个Manager[]对象赋予一个Employee[]的变量,但虚拟机会监控数组元素的类型,如果试图将一个Employee对象存储到该数组中,会抛出ArrayStoreException异常
可以将参数化类型转化为原始类型,Pair<Employee>是原始类型Pair的子类。
泛型类可以扩展或实现其他泛型类,如ArrayList<Employee>类实现List<Employee>接口。
通配符类型
通配符类型,允许类型参数变化,定义如下。
- Pair<? extends Employee>
此时的继承关系是,Pair<Employee> 或 Pair<Manager> > Pair<? extends Employee > Pair(原始类型)
超类型限定(supertype bound)
- Pair<? super Manager>
超类型限定限制为Manager的所有超类型。
带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象读取。
Java泛型相关总结(下)的更多相关文章
- Java泛型相关总结(上)
最近在看<Java核心技术>泛型相关的部分,总结下. 泛型程序设计是什么? 泛型编程(generic programming)是计算机编程中的一种风格,类型通过参数指定.意味着编写的代码可 ...
- Java泛型type体系
最近看开源代码,看到里面很多Java泛型,并且通过反射去获取泛型信息.如果说要看懂泛型代码,那还是比较容易,但是如果要自己利用泛型写成漂亮巧妙的框架,那必须对泛型有足够的了解.所以这两三天就不在不断地 ...
- 【Java心得总结四】Java泛型下——万恶的擦除
一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...
- 什么情况下不能使用 Java 泛型
1. 前言 Java 1.5 引入了泛型来保证类型安全,防止在运行时发生类型转换异常,让类型参数化,提高了代码的可读性和重用率.但是有些情况下泛型也是不允许使用的,今天就总结一下编码中不能使用泛型的一 ...
- Java:泛型基础
泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...
- Java深度历险(五)——Java泛型
作者 成富 发布于 2011年3月3日 | 注意:QCon全球软件开发大会(北京)2016年4月21-23日,了解更多详情!17 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件 ...
- Java泛型-类型擦除
一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ...
- java 深度探险 java 泛型
Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JD ...
- [转]Java 泛型: 什么是PECS(Producer Extends, Consumer Super)
以下内容转自: 原文链接: stackoverflow 翻译: ImportNew.com- 刘志军 译文链接: http://www.importnew.com/8966.html -------- ...
随机推荐
- Qt终结者之粒子系统
前言 粒子系统用于模拟一些特定的模糊效果,如爆炸.烟火.雪花.水流等.使用传统的渲染技术实现粒子效果比较困难,但是使用QML粒子系统能十分方便的实现各种粒子效果,使你的界面更加炫酷,动感. QML中的 ...
- C# 事件 解析
1.什么是事件,事件和委托什么关系? 事件?事件,就是,比如按一个按钮,弹出你好对话框,就是一个事件. 事件和委托? 事件就是委托的一种呀,委托可以理解为回调机制,回调函数. 2. 怎么理解C#事件, ...
- 微信小程序scroll-view滚动一次多次触发的问题解决方案
最近使用微信小程序开发的时候,需要用scroll-view的bindscrolltolower事件,控制加载下一页的内容.但是发现在ios里,下拉滚动一次,事件触发两次,导致重复加载数据. 经过百度和 ...
- 利用toggle实现背包
1.先创建入如图所示界面 2.在图片下面创建一个选中状态图片 3.在normal图片添加toggle组件,将子物体拖动到graphic里
- 运维route语法
Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table).要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或 ...
- WebStorm 安装及使用
WebStrom 插件安装 File(文件) -> settings(设置) -> Plugins 即可调出设置中的插件选项. 或者 按 快捷键ctrl + alt + s也可调出设置菜单 ...
- 树莓派安装tensorflow1.11
树莓派3B+ 环境:2018-11-13-raspbian-stretch 初始状态 首先将本地更新一下和安装 sudo apt-get update sudo apt-get upgrade 然后更 ...
- Request.ServerVariables参数说明
Request.ServerVariables["SERVER_NAME"] '获取服务器IP Request.ServerVariables["HTTP_REFERER ...
- ionic 3.0中使用原生插件ionic-native
作为一个ionic的新手,今天使用了ionic的原生粘贴板插件 @ionic-native/clipboard,根据ionic官方文档上执行的命令 $ ionic cordova plugin ad ...
- 2018-计算机系机试(第二批)-A-最大数
单点时限: 1.0 sec 内存限制: 256 MB 输入 n 个整数,输出其中最大数的值. 例如:3 个整数 1 ,2 和 6 的最大值是 6 . 输入格式 每一行的第一个数是 n (1≤n≤20 ...