首页 > 代码库 > javac的泛型

javac的泛型

 

 

 

 

 

?:在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义。

 

(1)?表示通配符,通配符 与 T 的区别 

T:作用于模板上,用于将数据类型进行参数化,不能用于实例化对象。 

public <T extends Number> void test(T t){
	t.byteValue();
}

 

再如将key,value的数据类型进行< K, V >参数化,而不可以使用通配符 

public class Container<K extends Number, V> { // 不能使用<K super Number>这样进行类型参数化
    private K key;
    private V value;

    public Container(K k, V v) {
        key = k;
        value = http://www.mamicode.com/v;>

  

(2)<? extends T>:是指 “上界通配符(Upper Bounds Wildcards)”,只取不放,因为如果有以下代码,我们并不知道这个水果盘子的具体盘子类型(new Plate<Apple>())。 

Plate<? extends Fruit> p=new Plate<Apple>();

注意与class Plate<T extends Fruit>的区别。 

 

 

技术分享

 

(3)<? super T>:是指 “下界通配符(Lower Bounds Wildcards)”,可以放,因为水果盘子肯定可以放入苹果,但是取时只能以Object接收。

技术分享

 

 

注意:

(1)一定要区别出?与T的区别,如class ClassName<T extends Number>{}与ClassName<? extends Number>的区别。

(2)对于类型参数化时只能使用extends关键字,而不能使用super

(3)只有类型参数化时才能有如<T extends C1&I1&I2>的形式,而通配符类型不允许有这样的写法。

(4)泛型擦除只针对类型参数化,与通配符没有任何关系

 

 

使用通配符后的类型有contravariant性质,contravariant参考:http://www.cnblogs.com/extjs4/p/6305654.html  

 技术分享

 

下面讨论下关于泛型的上下界,例如:

List<?>的上界为Object,下界为null

List<? extends Number>的上界为Number,下界为null

LIst<? super Number>的上界为Object,而下界为Number

 

javac的泛型