文档章节

? extends E 和 ? super E

o
 osc_x4h57ch8
发布于 2018/04/24 10:36
字数 662
阅读 11
收藏 0

精选30+云产品,助力企业轻松上云!>>>

? extends E 和 ? super E

B类:
public class B implements C {
@Override
public Map convert(Object from) {
return null;
}

}

C类:
@FunctionalInterface
public interface C<F, T, D> {

Map<String, Integer> convert(T from);

}

W类:
public class W extends V {

}


V类:
public class V implements D {

public void f() {
}
}

D接口:(实现了接口的实现类可以调用该接口的方法——> ? extends D 中的D可以是类,也可以是接口,不影响)
public interface D {

}


Z类:
public class Z extends W {

}

A类:
public class A {
public void f() {

B b = new B();

C c = new B();

V v = new V();

D d = new D();

W w = new W();

Z z = new Z();

Map<String, ? extends C> map = new HashMap<>();
map.put("", b);  //编译不通过! ->因为不知道具体的实现类

Map<String, ? super C> map2 = new HashMap<>();
map2.put("", b); //编译通过! ->因为限定put()的下限是C ,而B类实现了C接口;

Map<String, ? super V> map3 = new HashMap<>();
map3.put("", d); //编译不通过! ->因为d不是V的子类

Map<String, ? super V> map4 = new HashMap<>();
map3.put("", w); //编译通过! ->因为w是V的子类
map3.put("", v); //编译通过! ->添加的是V自身
map3.put("", z); //编译通过! ->因为z是W的子类,也算是V的子类
}
}

 

 

总结:
  !!!这里的 E 理解为一个范围,而不单单指一个类,范围是(从父类到其子类 这些类)。
 
  
  ? extends E:指的是E及其E的子类,指定了泛型的上限(E),由于E是该范围内最上面的类,所以在list.add(具体类)是不可以的,因为只知道泛型的上限,但具体添加的对象和 list = new ArrayList<>(),中的类不一定匹配,会出现类型转换问题,所以干脆不可以添加。

? super E:指的是E及其E的父类,指定了泛型的下限(E),由于指定了泛型的下限E,所以添加的对象只能是E或者E的子类,这样就不会出现类型转换错误,这就可以添加了,编译成功。

 

eg: 用list解释,map同理


目前有四个类,Person类、Student类、Teacher类、GoodStudent类。

四个类之间的关系:
Student类、Teacher类都继承了Person类
GoodStudent类继承于Student类

? extends Person类 : 这时指定的上限是Person,在list.add()的时候,由于只知道上限是Person,不知道具体的 ( List<> list = new ArrayList<>(); ) list是什么类型,所以不可以添加,因为new ArrayList<> 的时候,<>泛型可能是Teacher,也可能是Student,所以此时不管list.add()的是什么,是编译不通过的。-->因为此时还没有指定具体的 ArrayList<>;

? super Student : 这时指定的下限是Student,在list.add()的时候,只能addStudent或者其子类,这是已经指定好的,所以此时,我们就可以add(Student/Student子类了)。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

pyhon

cython 相关的帖子. http://blog.behnel.de/categories/cython.html

MtrS
4分钟前
0
0
多处理与线程Python - Multiprocessing vs Threading Python

问题: I am trying to understand the advantages of multiprocessing over threading . 我试图了解多处理优于线程的优势。 I know that multiprocessing gets around the Global Interpret......

法国红酒甜
9分钟前
5
0
格式编号始终显示2个小数位 - Format number to always show 2 decimal places

问题: I would like to format my numbers to always display 2 decimal places, rounding where applicable. 我想将数字格式化为始终显示2个小数位,并在适用的情况下四舍五入。 Examples...

富含淀粉
今天
22
0
Docker可视化工具Portainer

1 前言 从没想到Docker也有可视化的工具,因为它的命令还是非常清晰简单的。无聊搜了一下,原来已经有很多Docker可视化工具了。如DockerUI、Shipyard、Rancher、Portainer等。查看对比了一番...

南瓜慢说
今天
20
0
日志系统新贵 Loki,真香!!

最近,在对公司容器云的日志方案进行设计的时候,发现主流的ELK或者EFK比较重,再加上现阶段对于ES复杂的搜索功能很多都用不上最终选择了Grafana开源的Loki日志系统,下面介绍下Loki的背景。...

庞陆阳
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部