A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 爱上这格调 中级黑马   /  2013-11-5 16:26  /  1795 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在定义泛型的时候  如果是定义一个泛型上限要写成<? extends E>   E就是上限,
如果要定义泛型的下限  是不是可以直接写<E>相当于<? super E>
这点不确定  求大神解答

评分

参与人数 1黑马币 +1 收起 理由
乔兵 + 1

查看全部评分

3 个回复

倒序浏览
泛型的限定分为泛型的上限和下限

上限的格式为? extends E   :可以接收E类型或者E的子类型

下限的格式为? super E :可以接收E类型或者E的父类型

?为通配符,也可以理解为占位符,上下限是泛型里面比较重要的知识点尤其上限用处比较多,但就你的这个问题,我认为下限是不可以写成<E>的,因为java编译器是无法识别的。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
肯定不行了,直接写<E>是说只能是E,比如Person是Student父类,你泛型写的Student类的话就只能传Student对象了,传person类对象编译会失败的。而写<? super Student>就说明只要是Studen或其父类都可使用,?是通配符。谢谢
回复 使用道具 举报
可以通俗一点就是,>=,=,<=,这三个关系。<E>相当于=,看下面说明。
在使用泛型类的时候,既可以指定一个具体的类型,如List<String>就声明了具体的类型是String;也可以用通配符?来表示未知类型,如List<?>就声明了List中包含的元素类型是未知的。 通配符所代表的其实是一组类型,但具体的类型是未知的。List<?>所声明的就是所有类型都是可以的。但是List<?>并不等同于List<Object>。List<Object>实际上确定了List中包含的是Object及其子类,在使用的时候都可以通过Object来进行引用。而List<?>则其中所包含的元素类型是不确定。其中可能包含的是String,也可能是 Integer。如果它包含了String的话,往里面添加Integer类型的元素就是错误的。正因为类型未知,就不能通过new ArrayList<?>()的方法来创建一个新的ArrayList对象。因为编译器无法知道具体的类型是什么。但是对于 List<?>中的元素确总是可以用Object来引用的,因为虽然类型未知,但肯定是Object及其子类。考虑下面的代码:

public void wildcard(List<?> list) {
    list.add(1);//编译错误
}  
如上所示,试图对一个带通配符的泛型类进行操作的时候,总是会出现编译错误。其原因在于通配符所表示的类型是未知的。

因为对于List<?>中的元素只能用Object来引用,在有些情况下不是很方便。在这些情况下,可以使用上下界来限制未知类型的范围。 如List<? extends Number>说明List中可能包含的元素类型是Number及其子类。而List<? super Number>则说明List中包含的是Number及其父类。当引入了上界之后,在使用类型的时候就可以使用上界类中定义的方法。比如访问 List<? extends Number>的时候,就可以使用Number类的intValue等方法。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马