java泛型

2017-09-14  本文已影响0人  荡轻风

泛型类

一个泛型类 (generic class) 就是具有一个或多个类型变量的类。

public class a<T,U>{}

泛型方法

当某个类只有一个方法需要使用泛型时,可不必将整个类声明为泛型类,可以单独声明泛型方法。

public class ArrayAlg{
    public static <T> T getMiddle(T... a){
        return a[a.length / 2];
    }
}
String middle = ArrayAlg.<String>getMiddle("a","b","c");
//等同于,编译器有足够的信息能够推断出所调用的方法
String middle = ArrayAlg.getMiddle("a","b","c")

类型变量的限定

限定表示对变量进行进一步限制,必须继承自某类或者实现某接口。

public static <A extends Comparable,B extends Comparable> void test(A a,B b){}

类型擦除

无论何时定义一个泛型类型,都自动提供了一个相应的原始类型(raw type) 。原始类型的名字就是删去类型参数后的泛型类型名。 擦除类型变M , 并替换为限定类型(无限定的变量用Object)

public class A<T>{
    private T a;
    private T b;
}
//由于T是“无限定变量”擦除后将转变成原始类型(Object)
public class B{
    private Object a;
    private Object b;
}
public class A<T extends Comparable & Serializable> implements Serializable{
    private T a; 
    private T b;
}
//将转化为
public class A implements Serializable{
    private Comparable a; 
    private Comparable b;
}
Pair<Employee> buddies = ...;
Employee buddy = buddies.getFirst();
//编译器把这个方法调用翻译为两条虚拟机指令
//对原始方法 Pair.getFirst()的调用,此时泛型方法将返回Object
//将返回的Object类型强制转换为Employee类型。
public class a<T>{
    private T name;
    public void setName(T name){}
    public T getName(){}
}
//类型擦除后转变为
public class a{
    private Object name;
    public void setName(Object name){}
    public Object getName(){}
}

public class b extends a<String>{
    public void setName(String name){}
    public String getName(){}
}
//类型擦除后转变为 重载了setName方法而不是重写
public class b extends a{
    public void setName(String name){}
    //编译器会生成一个桥方法来实现多态
    public void setName(Object name){
        setName(String(name));
    }
    //编译器会生成一个桥方法实现对getName的覆盖
    public Object getName(){
        return String(this.name);
    }
}

上一篇 下一篇

猜你喜欢

热点阅读