美文网首页
Java泛型

Java泛型

作者: wMeSlAx767 | 来源:发表于2019-05-26 15:35 被阅读0次

    Java泛型可能有的几种形式:

    • <T>
    • <?>
    • <? extends T>
    • <? super T>

    1. <T>

    最简单就是指定一种具体的类型,无论是set还是get获取的都是固定的T类型。

    2. <?>

    ?表示所有类型,但是不知道到底是哪种类型。和T的方式有区别,T是有确定的类型,而?则可能是所有类型。

    3. <? extends T>

    例如: List<? extends Fruit> list = new ArrayList<Apple>();
    其中T 表示 Fruit,而Apple是Fruit的子类,所以<? extends Fruit>是<Apple>的父类,那么new ArrayList<Apple>()的引用是可以赋值给 List<? extends Fruit>。但是通过list 这个new ArrayList<Apple>()对象进行操作时,list的类型是? extends Fruit,那么用户可能添加Banana、Orange,他们和Apple是兄弟关系,而ArrayList<Apple>()实例是不可以添加Banana的。所以编译器规定不运行执行add操作。只能get,因为当get是能保证至少都是Fruit类型。

    4. <? super T>

    例如: List<? super Fruit> list = new ArrayList<Food>();
    其中 T 是 Fruit,Fruit是Food的子类。那么<? super Fruit> 是<Food>的父类。当通过List<? super Fruit> list进行增加操作时,只要是Fruit的子类,都是可以添加到 ArrayList<Food>的实例当中的。但是当通过list进行获取操作时,Fruit可能有多个父类,那么get获取到的是哪个父类呢?不知道。就懵逼了。倒是可以获取到Object这个通用的父类。

    理解:

    • 可以将? extends T? super T 看成一种具体的类型,只是写法比较怪异。
    • 重点是 视角。当通过List<? super Fruit> list 参数操作时,我们要想到他实例化对象 后面的可能性。

    引用

    相关文章

      网友评论

          本文标题:Java泛型

          本文链接:https://www.haomeiwen.com/subject/qwaxtctx.html