Java泛型笔记

Java泛型笔记

  1. 泛型参数是不型变的

    List<String> list = new ArrayList<String>;
    list=new ArrayList<Object>; //编译失败
    
  2. 已知泛型上界

    List<? extends Object> list=new ArrayList<Object>;
    list.add("1");//编译失败
    list.add(new Object());//编译失败
    

    ? extends Object 说明 这个对象的上界是Object,但是你并不知道他实际的类型是什么

    1. 假如你要读取,你可以把它当成Object来使用,因为这实际上是向上转型,是允许的。
      假设这个对象的实际类型是String,则读取时操作是:Object o=string// string 的类型是String
    2. 假如你要写入,无论你把它当成什么类型,都是不允许的,因为你无法知道他的实际类型,所以任何类型进行写操作都是向下转型,这都是不允许的。
      假设这个对象的实际类型是String,则写入时操作是:String string=(String)o// o的类型是Object
      注意:这里很自然的就使用了向下转型,但是在通配符里,你根本无法知道你要向下转型成什么类型,所以你无法对一个已知上界的泛型进行写操作
  3. 已知泛型下界

    List<? super String> list=new ArrayList<Object>;
    list.add("1");//成功
    list.add(new Object());//成功
    

    ? super String 说明 这个对象的下界是String,但是你依然并不知道他实际的类型是什么

    1. 假如你要读取,对不起,不允许,因为你不知道要向下转型成什么类型
      假设这个对象的实际类型是Object,则读取时操作是:String string=(String)o// o的类型是Object
    2. 假如你要写入,你可以把它当成String来使用,因为这实际上是个向上转型
      假设这个对象的实际类型是String,则写入时操作是:Object o=string// string的类型是String
      注意:此处的o可使用任何String 的父类替代,但是如果方法返回的是T(泛型参数),依然还是会返回Object对象,而不会是实际的对象类型,因为编译器也不知道实际类型是什么,编译器只知道这个类型是String的父类而已

综上,已知上界的读取是允许的,已知下界的写入是允许的,已知上界和下界的话,就可以任意读取该泛型参数对象了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值