java 泛型 ? extedns T与 ? super T

2022-10-28  本文已影响0人  在岁月中远行

java的一个设计理念就是 与泛型相关的异常最好是在编译期间就被发现,因此设计了extends与super这两种方式。

具体来说,List<? extends T>表示该集合中存在的都是类型T的子类,包括T自己。

List<? super T>表示该集合中存的都是类型T的父类,包括T自己

List<? extends T >如果去添加元素的时候,因为List存放的其实是T的一个子类,如果我们去添加元素,其实不知道到底应该添加T的哪个子类,但是我们如果是从集合中取的话肯定可以确定是T类型,所以extends T这种方式可以取元素但是不能添加元素,这就是get原则。

List<? super T>因为存放的都是类型T的父类,所以如果去添加T类或者T类子类的元素,肯定是可以的,但是如果将元素取出来,则不知道是什么类型,所以? super T可以添加元素但是没办法取出来,这个就是put原则。

继续介绍一下二者:

Lits<? extends T> 这里的T 是泛型,而?是通配符,? extends T表示T是父类,?是子类,该集合只能容纳T类型以及T类型的子类。可以用下图表示:

界限在?的上面,因此extengds 称之为上界,给?限定了一个上界,? extends T也叫上界通配符。

? super T表示T是子类,?是父类,该集合只能容纳T类型以及T类型的父类。

所有 ?super T可以用下图表示:

因为界限在?的下面,因此将super称之为下界,所以super给?限定了一个下界。

下面来看看例子以及代码。(画图软件用的亿图)

新建几个类:

那么既然genericList不能添加元素,但是可以借助其他方式初始化元素。

总结:由于只能从List<? extends T>中获取元素,而不能向他添加元素,所以称之为生产者。

外界可以从这集合中不断地get元素,那么此集合就作为生产者。

2 接下来说说List<? super T>

List<? super Animal> list=new ArrayList()

此时这个集合可以添加元素。可以添加Anmial类以及子类。

假如?表示Biological生物类,那我添加Anmial类没错吧,因为动物也是生物。

如果是物质Material类,那我添加Animal类也没错的,因为动物也是物质。

如果是物质Material类,那我添加Dog类也没错的,因为狗也是物质。

总结:由于只能向List<? super T>添加元素,而不能从它里面获取元素,所以称之为消费者。

外界需要不断地往元素给集合里面,所以对于外界来说集合就是个消费者。需要消费外界的元素。(都是相对于外界而言)。

最后:

PESC原则(Producter extends consumer super)原则指的就是上述,但用extends时 集合作为一个生产者,供外界获取元素。反之。

上一篇 下一篇

猜你喜欢

热点阅读