【0】README
0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 定义泛型类+泛型方法的知识;
【1】一个泛型类: 就是具有一个或多个类型变量的类;
1.1)看个荔枝:
public class Pair<T>
{private T first;private T second;public Pair() { first = null; second = null; }public Pair(T first, T second) { this.first = first; this.second = second; }public T getFirst() { return first; }public T getSecond() { return second; }public void setFirst(T newValue) { first = newValue; }public void setSecond(T newValue) { second = newValue; }
}
对以上代码的分析(Analysis):
- A1) Pair类引入了一个类型变量T,用尖括号(<>) 括起来, 并放在类名的后面;
- A2)泛型类可以有多个类型变量, 如, 定义 Pair 类, 其中第一个和第二个域使用不同的类型: public class Pair
Pair<String>();
Pair<String>(String , String);
和方法:
String getFirst()
String getSecond()
void setFirst(String)
void setSecond(String)
- 1.2.2)一句话说完: 泛型类可以看做普通类的工厂;
1.3)看个荔枝:
【2】 泛型方法
2.1)如何定义一个带类型参数的泛型方法:
class ArrayAlg
{public static<T> T getMiddle(T... a){return a[a.length / 2];}
}
- 2.1.1)当调用一个泛型方法时, 在方法名前的尖括号中放入具体的类型:
String middle = ArrayAlg.<String>getMiddle("john", "Q.", public ");
- 2.1.2)其实, 方法调用中可以省略 类型参数, 编译器有足够的信息能偶推断出所调用的方法;也就是说, 可以调用
String middle = ArrayAlg.getMiddle("john", "Q.", public ");
2.2)在大多数情况下, 对于泛型方法的引用都没有问题。 偶尔, 编译器也会提示错误,看个荔枝:
double middle = ArrayAlg.getMiddle(3.14, 0, 1729);
- 2.2.1)简单地说, 编译器将会自动打包参数为 1个 Double 和 2个Integer 对象,而后寻找这些类的共同超类型。
- 2.2.2)事实上, 找到2个这样的超类型:Number 和 Comparable 接口, 其本身也是一个泛型类型。 在这种情况下, 可以采取的补救措施是 将 所有的参数写为 double 值;
Hint)
- H1)如果想要知道 编译器对一个泛型方法调用最终推断出哪种类型, 某某人推荐一个方法:有目的地引入一个错误, 并研究所产生的错误消息。
- H2)例如,看一下调用 ArrayAlg.getMiddle(“hello”, 0, null), 这是肯定错误 的, 将会得到错误报告:
大致的意思是:可以将结果赋值给 Object、Serialiable 或 Comparable;