super T 和? extends T区别
来源:互联网 发布:男生发型软件app 编辑:程序博客网 时间:2024/04/29 05:37
Java 泛型
关键字说明
- ? 通配符类型
- <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类
- <? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object
extends 示例
static class Food{}static class Fruit extends Food{}static class Apple extends Fruit{}static class RedApple extends Apple{}List<? extends Fruit> flist = new ArrayList<Apple>();// complie error:// flist.add(new Apple());// flist.add(new Fruit());// flist.add(new Object());flist.add(null); // only work for null
List<? extends Frut> 表示 “具有任何从Fruit继承类型的列表”,编译器无法确定List所持有的类型,所以无法安全的向其中添加对象。可以添加null,因为null 可以表示任何类型。所以List 的add 方法不能添加任何有意义的元素,但是可以接受现有的子类型List<Apple> 赋值。
Fruit fruit = flist.get(0);Apple apple = (Apple)flist.get(0);
由于,其中放置是从Fruit中继承的类型,所以可以安全地取出Fruit类型。
flist.contains(new Fruit());flist.contains(new Apple());
在使用Collection中的contains 方法时,接受Object 参数类型,可以不涉及任何通配符,编译器也允许这么调用。
super 示例
List<? super Fruit> flist = new ArrayList<Fruit>();flist.add(new Fruit());flist.add(new Apple());flist.add(new RedApple());// compile error:List<? super Fruit> flist = new ArrayList<Apple>();
List<? super Fruit> 表示“具有任何Fruit超类型的列表”,列表的类型至少是一个 Fruit 类型,因此可以安全的向其中添加Fruit 及其子类型。由于List<? super Fruit>中的类型可能是任何Fruit 的超类型,无法赋值为Fruit的子类型Apple的List<Apple>.
// compile error:Fruit item = flist.get(0);
因为,List<? super Fruit>中的类型可能是任何Fruit 的超类型,所以编译器无法确定get返回的对象类型是Fruit,还是Fruit的父类Food 或 Object.
小结
extends 可用于的返回类型限定,不能用于参数类型限定。super 可用于参数类型限定,不能用于返回类型限定。>带有super超类型限定的通配符可以向泛型对易用写入,带有extends子类型限定的通配符可以向泛型对象读取。——《Core Java》
0 0
- ?super T 和? extends T区别
- ?super T 和? extends T区别
- ?super T 和? extends T区别
- ?super T 和? extends T区别
- super T 和? extends T区别
- ?super T 和? extends T区别
- ?super T 和? extends T区别
- ?super T 和? extends T区别
- <? super T>和<? extends T>的区别
- 泛型中<? extends T>和<? super T> 区别
- <? extends T>和<? super T>区别
- 泛型<?super T> 和<? extends T>区别
- Java中 <? super T>,<? extends T>,和<T>的区别
- Java中 <? super T>,<? extends T>,和<T>的区别
- Java中 <? super T>,<? extends T>,和<T>的区别
- <? extends T>和<? super T>
- Java 泛型中? super T和? extends T的区别
- List<?super T> 和 Set<? extends T> 区别
- ArrayList 扩容 Android Java 真的不一样
- IDEA里面为项目添加编写Groovy支持
- ps笔记
- SpringMVC同时支持多视图(JSP,Velocity,Freemarker等)的一种思路实现
- C++11多线程(十三):《C++11 内存模型一:介绍》
- super T 和? extends T区别
- DSP/BIOS详解入门
- 手写笔记
- timer_create定时器使用
- String转Json,jsonArray,jsonObject
- Oracle操作命令详解
- C++11多线程(十四):《C++11 内存模型二:》
- 用nginx搭建http/rtmp/hls协议的MP4/FLV流媒体服务器
- 【d3.js教程13】气泡图一维与多维展示以及数据处理