东莞做网站首选,邯郸网站seo,今天的新闻 联播最新消息,网站建设与代运营产品介绍【0】README
0.1#xff09; 本文描述源代码均 转自 core java volume 1#xff0c; 旨在理解 java泛型程序设计 的 类型变量限定 泛型代码和虚拟机 的知识#xff1b; 【1】类型变量的限定
1.1#xff09;类和方法需要对类型变量加以限定
1.1.1#xff09;看个荔枝 本文描述源代码均 转自 core java volume 1 旨在理解 java泛型程序设计 的 类型变量限定 泛型代码和虚拟机 的知识 【1】类型变量的限定
1.1类和方法需要对类型变量加以限定
1.1.1看个荔枝
class ArrayAlg
{public static T T min(T[] a){if(a null || a.length0) return null;T smallest a[0];for(int i1;ia.length;i)if(smallest.compareTo(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 替换T2.2.2但是如果T有限定的话 如 T extends Comparable Serializable 看个荔枝 public class IntervalT 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 接口即没有方法的接口放在边界列表的末尾