600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > java泛型程序设计——类型变量限定 + 泛型代码和虚拟机

java泛型程序设计——类型变量限定 + 泛型代码和虚拟机

时间:2019-08-05 15:22:46

相关推荐

java泛型程序设计——类型变量限定 + 泛型代码和虚拟机

【0】README

0.1)本文描述+源代码均 转自 core java volume 1, 旨在理解java泛型程序设计 的 类型变量限定 + 泛型代码和虚拟机的知识;

【1】类型变量的限定

1.1)类和方法需要对类型变量加以限定

1.1.1)看个荔枝:

class ArrayAlg{public static <T> T min(T[] a){if(a == null || a.length==0) return null;T smallest = a[0];for(int i=1;i<a.length;i++)if(pareTo(a[i]) > 0) smallest = a[i];return smallest;}}

对以上代码的分析(Analysis):

A1)出现的问题:变量smallest 的类型为 T ,意味着它可以是任何一个类的对象。怎么才能确定T 所属的类有 compareTo 方法呢?A2)解决方法:将T 限制为 实现了 Comparable 接口(只含有一个compareTo的标准接口)的类。可以通过对类型变量T设置限定实现这一点:

public staitc <T extends Comparable> T min(T[] a);

现在, 泛型的main方法只能被实现了 Comparable 接口的类(如 String, Date 等)的数组调用。 由于 Rectangle 类没有实现 Comparable接口, 所以调用min 方法将会产生一个编译错误;

A3)读者奇怪:为什么使用关键字extends 而不是 implemens , 因为Comparable是一个接口。

A3.1)看个荔枝:表示T 应该是绑定类型的子类型。T 和 绑定类型可以是类, 也可以是接口。 选择关

键字extends 的原因是更接近子类的概念, 并且 java 的设计者也不打算在语言中再添加一个新的 关键字;

1.2)一个类型变量或通配符可以有多个限定, 如

T extends Comparable & Serializable 限定类型用 & 分割, 而逗号用来分割类型变量;

1.3)在java继承中, 可以根据需要拥有多个接口超类型, 但限定中至多有一个类。 如果用一个类作为限定, 它必 须是限定列表中的第一个;

1.4)看个荔枝:

【2】泛型代码和虚拟机

2.1)虚拟机没有泛型类对象——所有对象都属于普通类;

2.1.1)原始类型:无论何时定义一个泛型类型, 都自动提供了一个相应的 原始类型。 原始类型的名字就是删去类型参数后的泛型类型名。2.1.2)擦除操作:擦除类型变量, 并替换为 限定类型(无限定的变量用 Object, 如只有T,没有 T extends Comparable 的限定类型);2.1.3)看个荔枝:Pair(下图中的代码) 的原始类型(下面的源代码)如下,

public class Pair{private Object first;private Object second;public Pair() { first = null; second = null; }public Pair(Object first, Object second) { this.first = first; this.second = second; }public Object getFirst() { return first; }public Object getSecond() { return second; }public void setFirst(Object newValue) { first = newValue; }public void setSecond(Object newValue) { second = newValue; }}

对以上代码的分析(Analysis):

A1)因为T是一个无限定的变量,所以直接用 Object 替换;A2)在程序中可以包含不同类型的 Pair ,如 Pair, Pair , 而擦除类型后就变成原始的Pair 类型了;

2.2)原始类型用第一个限定的类型变量来替换, 如果没有给定限定就用 Object替换。

2.2.1)没有限定类型:如上述荔枝中的 Pair 没有类型变量没有限定(没有 T extends … 语句), 因此,原始类型用 Object 替换T;2.2.2)但是如果T有限定的话:如 T extends Comparable & Serializable ,看个荔枝:

public class Interval<T extends Comparable & Serializable> implements Serializable{private T lower;private T upper;public Interval(T first, T second){}}

原始类型 Interval 如下所示:

public class Interval implements Serializable{private Comparable lower;private Comparable upper;public Interval(Comparable first, Comparable second){}}

Annotation)

A1)如果切换限定:class Interval 《Serializable & Comparalbe> 会发生什么?A2)如果这样做 :原始类型用 Serializable 替换T , 而编译器在必要时要向 Comparable 插入强制类型转换。A3)为了提高效率:应该将标签(tagging) 接口(即没有方法的接口)放在边界列表的末尾;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。