泛型的上届和下届 extends super

上界:
上界用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。如下面的代码:

出错的情况
Map<String, ? extends Object> map = new HashMap<String, Object>();

map.put("aaaa", "aaaaaa");

这里会出错,是因为extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。因此,实际的map对象的value类型,可能是Integer String Long 等等。而实际的map变量的value类型是不可预测的。假设实际的map的value类型是Integer,那么不就有问题了,因为万一是Integer的话,它无法存入String的。因此在编译器就报错了。


下界
下界用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object。如下面的

Map<String, ? super Object> map = new HashMap<String, Object>();

map.put("aaaa", "aaaaaa");

这个时候就不会抱错了。

因为这个时候的value泛型类型可能是Object或者Object的父类,因此,你传String进去,肯定能包容这个value。


下界
下界用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object。如下面的代码:


Map<String, ? super String> map = new HashMap<String, String>();

map.put("aaaa",new Object());
依然抱错。
原因类型,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object。既然可能是指定类型的父类,理论上应该可以put父类,但是别忘了,如果实际的泛型类型是String,String x = new Object();(这句就肯定编译不成功),Object它不是String类型,自然不能put进去。

你可能感兴趣的:(extends)