泛型_通配符深入总结

泛型介绍

1、

List   原始类型

List<?>  通配符类型

List<T> 任意引用类型,泛型类型

List<Object>具体类型

Integer[] 是Number[]的子类型

T

只能用在定义类时期,如class ClassName<T>(){}

在实例化一个对象时则必须明确T的类型。实例化类型时,作为引用类型(如List<T> l = 。。。)会提示T不能被解析为一个类型  而作为实例化对象中的类型(new ArrayList<T> ())时则会提示修改意见。

是一个实际的类型参数,表示不明确类型

通配符不能使用在定义类时期,也就是在定义类时,class ClassName<?>{},这样是不可以的,编译器提示:无效的参数。

只能使用在实例化一个类时,作为引用泛型类型中的类型参数。ArrayList<?> al = new  ArrayList<String>();

但不能作为实例化对象中的类型参数,也就是说,一个集合对象(new Collection< T>),必须明确他类型参数的类型(尖括号中的类型,如new ArrayList<String>中的String),或者使用原始类型new Collection();否则(如new ArrayList<T> ())会提示修正意见,或者(如new ArrayList<?> )会提示不能实例化类型ArrayList<?>

 

总结一下就是

            集合创建时((引用部分)List<_> l = (实例部分)new ArrayList<_> ();),实例部分必须是一个明确的类型,不能是通配符?(提示不能实例化类型ArrayList<?>)和T(提示修改意见)。引用部分可以是不明确类型参数的类型的泛型类型(使用通配符?)或者 明确类型参数的类型的泛型类型如String等

           而在使用时,只能按照声明的引用类型(引用类型有可能是不明确类型参数的类型的泛型类型如List<?> l;,有可能是明确类型参数的类型的泛型类型如List<String> l;)的操作方式来操作。(就是说如果声明的是不明确类型参数的类型的泛型类型,就只能按照不明类型的操作方式来操作,即这是一个不明确的类型,所以你不能使用add()方法,你可以这样想,如果添加的是Integer(add(Integer)),那么集合会问你,我又没说我里面装的是Integer,你怎么能往我里面装Integer呢?),但是可以使用和类型参数无关的方法

class Box<T>{
      pub(T t){}
      get(){}
}

我们实例化一个box,box不明确类型参数的类型的类型的泛型作为引用变量的类型

Box<?> box = new Box<String>();
我们仅仅能使用的是和参数类型无关的方法get()

对于get()的返回类型,box调用了get以后,它知道get的返回的是一个不明确的T,它可以推断出他是T的擦除(earsure),对于无上线的通配符,就是Object,因此get()将会被当作Object

 

通配符的好处是,我们可以编写操作一个泛型类型实例对象的代码,而不用去知道这个泛型类型的类型参数的类型是String还是Integer或者是其他类型,如

public void OpenBox(Box<?> box){

}


 

 

 

2、

2.1

  List<T> l =new  ArrayList<T>();//错误                 引用部分T不能被解析为类型,实例部分将提示修改建议
  List<T> l3 = new ArrayList<?>();//错误               引用部分T不能被解析为类型,实例部分,不能实例化类型ArrayList<?>
  List<T> l4 = new ArrayList<String>();//错误        引用部分T不能被解析为类型,实例部分正确
  List<?> l2 = new ArrayList<?>();//错误                引用部分正确,实例部分不能实例化类型ArrayList<?>

2.2
  List<?> l1 = new ArrayList<String>();//正确
  l1.add(1);//错误               The method add(int, capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (int) 参数不适用
  for (Object object : l1) {
   System.out.println(object);
  }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值