类型通配符的表示方式:问号? 如:
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