类型通配符的那点小事儿

来源:互联网 发布:fukase知乎 编辑:程序博客网 时间:2024/04/30 02:15

类型通配符的表示方式:问号?  如:

List<?> list=new ArrayList();是表示未知类型的List ,她是任何类型的List的父类,如下面的强制类型转换是正确的:

List<String> list1=(List<String>)list;

list.add("hello");//是错误的,因为list是未知类型,所以只能加入null;

list1.add("hello");//是正确的,因为list1是String类型

public static void test(List<?> c)//或者参数是List<? Object>也是错误的,因为同样不知道c的类型
{
 for(int i=0;i<c.size();i++)
 {
  System.out.println(c.get(0));
 }
// c.add("www");//是错误的,因为编译时不知道c是什么类型,所以编译错误
}

请注意了:List<Object >不是List<String>的子类,不要以为Object 是String的之类,就张冠李戴的因为List<Object >是List<String>的子类,泛型之间的父子类只能通过含通配符"?"来表示的。

 如有:class Cat  extends  Animal   class Dog  extends Animal 则泛型的父子类之间的关系是:List<? exnteds Animal>是List<Cat> 和List<Dog>的子类  :List<? exnteds Animal是通配符的上限表示法,也就是:List<? exnteds Animal>是所有Animal之子类集合列表List的子类,通配符的超类表示法List<? super Cat>是Cat 的父类集合

泛型的擦除 如 class Apple<T extends Number>

Apple<Integer>a =new Apple<6>;

Apple b=a;

则b里保存的类型信息丢失,即b里保存的类型信息是Number,而不是Integer

 

 

0 0
原创粉丝点击