Java 泛型类约束与局限性
1.不能用基本类型实例化类型参数;
- Pair<double> // 这样是错误的
2.运行时类型查询只适用于原始类型
- Pair<String> stringPair = ...;
- Pair<Employee> employeePair = ...;
- if(StringPair.getClass() == employeePair.getClass())// they are equal
3.不能抛出也不能捕获泛型类实例
- public class Problem<T> extends Exception{/* */} // error -- can't extend Throwable
- public static <T extends Throwable> void doWork(Class<T> t) {
- try {
- do work;
- } catch(T e) { // error -- can't catch type variable
- Logger.global.info(...);
- }
- }
- public static <T extends Throwable> void doWork(T t) { // ok
- try {
- do work;
- } catch(Throwable realCause) {
- t.initCause(realCause);
- throw t;
- }
- }
4.参数化类型的数组不合法
- Pair<String>[] table = new Pair<String>[10]; // Error
5.不能实例化类型变量
- public Pair() {
- first = new T(); // error
- second = new T(); // error
- }
- public static <T> Pair<T> makePair(Class<T> cl) { // ok
- try {
- return new Pair<T>(cl.newInstance(), cl.newInstance());
- } catch(Exception e) {
- return null;
- }
- }
- Pair<String> p = Pair.makePair(String.class);
6.泛型类的静态上下文中类型变量无效
- public class Singleton<T> { // error
- private static T instance; // error
- public static T getSingleInstance() {
- if(null == instance) {
- instance = ...; // construct new instance of T
- return instance;
- }
- }
- }
7.注意擦除后的冲突
- public class Pair<T> {
- private T first;
- private T second;
- public boolean equals(T value) {
- return first.equals(value) && second.equals(value);
- }
- }
- boolean equals(String) // define in Pair<T>
- boolean equals(Object) // inherited from Object
- boolean equals(T) // T is erased into Object
- boolean equals(Object) // two identical equals methods