Java Generic

16-05-01 编程 #java #泛型

泛型

// 类
class Tuple<T, S> {
    private T first;
    private S second;
}
// 泛型方法也可在非泛型类里面
class ArrayAlg {
    public static <T> T getMiddle(T... a) {
        return a[a.length / 2];
    }

}
String middle = ArrayAlg.<String>getMiddle("]ohnM, "Q.n, "Public");// right,<String>可以省略

String middle = GenericCls.getMiddle("hello",0,null);// error

//  Errr:(7, 45) java: 不兼容的类型:推断类型不符合上限
//     推断:java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>
//     上限:java.lang.String,java.lang.Object 

类型限定

public static <T extends Comparable> T min(T a)

// 如果多个类型,则:T extends Comparable & Serializable
// 只能有一个类,且类必须紧跟 extends,但是可以有多个接口

类型擦除


//Tuple<T,S>在虚拟机变为
class Tuple {
    private Object first;//当调用 getFirst 时,则发生强制转换
    private Object second;
}

//泛型方法同样有擦除
public static <T extends Comparable> T min(T a)
// =>
public static Comparable min(Comparable a)

约束

if (a instanceof Pair<String>) // Error
if (a instanceof Pair<T>) // Error
Pair<String> p = (Pair<String>) a; //warning
Pair<String>[] table = new Pair<String>[10]; // Error
Pair<String>[] table; //声明是合法的,只是无法实例化
@SafeVarargs
public static <T> void addAll(Collection<T> coll, T... ts)
public class Singleton<T> {
    private static T singlelnstance; // Error
    public static T getSinglelnstance{// Error
        if (singleinstance == null) {//construct new instance of T
            return singlelnstance;
        }
    }
}
public class Problem<T> extends Exception { /* . . . */ } // Error can't extend Throwable
public class Pair<T> {
    T first;
    T second;

    public boolean equals(T value) { //error 和 Object.equals 冲突
        return first.equals(value) && second, equals(value);
    }
}

泛型继承

class Employee
class Manager extends Employee

//Pair<Employee> 和 Pair<Manager> 没用任何继承关系

通配符 和 PECS

Pair<? extends Employee
Pair<? super Manager

反射和泛型