黑马程序员技术交流社区
标题:
关于泛型的问题
[打印本页]
作者:
爱上这格调
时间:
2013-11-5 16:26
标题:
关于泛型的问题
在定义泛型的时候 如果是定义一个泛型上限要写成<? extends E> E就是上限,
如果要定义泛型的下限 是不是可以直接写<E>相当于<? super E>
这点不确定 求大神解答
作者:
涐扪①起奮乧
时间:
2013-11-5 17:13
泛型的限定分为泛型的上限和下限
上限的格式为? extends E :可以接收E类型或者E的子类型
下限的格式为? super E :可以接收E类型或者E的父类型
?为通配符,也可以理解为占位符,上下限是泛型里面比较重要的知识点尤其上限用处比较多,但就你的这个问题,我认为下限是不可以写成<E>的,因为java编译器是无法识别的。
作者:
Clare0621
时间:
2013-11-6 11:58
肯定不行了,直接写<E>是说只能是E,比如Person是Student父类,你泛型写的Student类的话就只能传Student对象了,传person类对象编译会失败的。而写<? super Student>就说明只要是Studen或其父类都可使用,?是通配符。谢谢
作者:
赵许星
时间:
2013-11-6 12:26
可以通俗一点就是,>=,=,<=,这三个关系。<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等方法。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2