类型通配符的那点小事儿

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值