Java中的泛型
2015-11-20 01:11
405 查看
一、泛型类和泛型方法
public class Pair<T>{...}public static <T> T getMiddle(T[] a){...}
public static <M> M,<V> V myCompate(M am,V av){...}
public static <T extends Comparable & Serializable> T getMiddle(T[] a)
增加限定符,之间用&分隔;可以有多个接口,如果有类继承关系,只能有一个,并且必须放在首位
二、泛型代码和虚拟机
虚拟机中的对象全部是普通的类对象,没有泛型对象。泛型只是作编译检查?泛型对象首先要进行类型擦除生成原始类型,原始类型的名字就是删去类型参数后的泛型类型名。
public class Pair{...}
public static Object getMiddle(Object[] a){...}
public static Object myCompate(Object am,Object av){...}
public static <Comparable > getMiddle(Comparable[] a)
程序使用泛型的时候,会强制进行类型转换,转换为实例化类型,再进行处理。
例如double inst[];getMiddle(inst),会先将Object[]转换为Double[]。
三、约束与限定
1、不能用基本类型实例化类型参数2、运行时类型查询只返回原始类型
instanceof、强制类型转换、getClass()...
3、不能抛出也不能捕获泛型类型的实例
4、参数化类型的数组不合法
Pair<String>[] table = new Pare<Sting>[10];//ERROR
5、不能实例化类型变量
6、泛型类的静态上下文中类型变量无效
四、泛型类型的继承规则
1、Manger是Employee的子类,但是Pair<Employee>和Pair<Manager>没有啥子关系2、ArrayList<Manager>是List<Manger>的子类
五、通配符类型
1、Pair<? extends Employee>表示类型参数是Employee子类的Pair类型;Pair<Manger>是Pair<? extends Employee>的子类;可以使用返回值,但是不能为方法提供参数Pair<? extends Employee> = new Pair<Manger> //OK
void setField(Pair<? extends Employee>) //参数不能是Pair<Manger>
2、Pair<? super Manger>表示类型参数是Manger超类的Pair类型;可以为方法提供参数,但是不能使用返回值
void setField(Pair<? super Manger>)//参数可以是Pair<Employ>
Pair<? super Manger> = Pair<Employ> //ERROR
参考文献
《java核心技术 卷1:基础知识》
相关文章推荐
- Java源程序的编译及执行问题
- Java 数组Array 转换为 List
- 在servlet中用spring @Autowire 注入.
- Java事件机制
- WEBjava开发日记(1)
- java正则表达式筛选字符串中的ip
- java中String的常用方法
- 10018---JavaWeb基础--过滤器(Filter)
- JAVA中怎样把用户输入的字符串存入数组中?
- Java数组的基本操作
- java.lang.OutOfMemoryError: Java heap space解决方法
- 异常:pointerIndex out of range
- OpenProj打开不了或者提示"Failed to load Java VM Library"的错误的解决方案
- Spring Security(01)——初体验
- Java PinBall 简单弹球小游戏【4】碰撞检测及边界检测
- Spring mvc 中使用 kaptcha 验证码
- Spring AOP 实现原理以及应用
- java Es Api --解决大量数据查询
- 关于JVM中long和double的读取原子性
- Java 事务及隔离级别