使用 Generic 的限制

使用 Generic 的限制

Generic 使用的限制 #

  1. 原生数据类型不能用到 Type 参数中。写 Pair<double> 会出错,而应使用 Pair<Double>。

  2. 运行时类型检测只对 Raw Type 起作用。

    if (a instanceof Pair<String>)
    

    与下面的写法是完全一样的:

    if (a instanceof Pair<T>)
    

    Type 参数会被忽略,另一种写法是:

    if (stringPair.getClass() == employeePair.getClass())
    
  3. Throw 和 Catch 语句中不能使用 Generic 类型。

    public class Problem<T> extends Exception { /* . . . */ } // ERROR--can't extend Throwable
    
  4. 数组中不能使用 Type 参数。

    Pair<String>[] table = new Pair<String>[10]; // ERROR
    
  5. Type 变量不能实例化。

    public Pair() { first = new T(); second = new T(); } // ERROR
    

    必须通过反射才能创建 Type 对应的实例。参看 Core Java I 8th 第628页。

  6. Generic 类的静态字段和静态方法中不能使用 Type 变量。

  7. 移除类型参数可能会导致冲突。比如Pair<T>中定义了 boolean equals(T value)方法,在删除了T以后会和 Object.equals(Object value)冲突。

From #