原创转载请注明出处:http://agilestyle.iteye.com/blog/2376027
extends
The wildcard declaration of List<? extends Number> foo3 means that any of these are legal assignments:
List<? extends Number> foo3 = new ArrayList<Number>(); // Number "extends" Number (in this context) List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number List<? extends Number> foo3 = new ArrayList<Double>(); // Double extends Number
super
The wildcard declaration of List<? super Integer> foo3 means that any of these are legal assignments:
List<? super Integer> foo3 = new ArrayList<Integer>(); // Integer is a "superclass" of Integer (in this context) List<? super Integer> foo3 = new ArrayList<Number>(); // Number is a superclass of Integer List<? super Integer> foo3 = new ArrayList<Object>(); // Object is a superclass of Integer
PECS
Remember PECS: "Producer Extends, Consumer Super".
- "Producer Extends" - If you need a List to produce T values (you want to read Ts from the list), you need to declare it with ? extends T, e.g. List<? extends Integer>. But you cannot add to this list.
- "Consumer Super" - If you need a List to consume T values (you want to write Ts into the list), you need to declare it with ? super T, e.g. List<? super Integer>. But there are no guarantees what type of object you may read from this list.
- If you need to both read from and write to a list, you need to declare it exactly with no wildcards, e.g. List<Integer>.
example
Note how the source list src (the producing list) uses extends, and the destination list dest (the consuming list) uses super
public class Collections { public static <T> void copy(List<? super T> dest, List<? extends T> src) {} for (int i=0; i<src.size(); i++) { dest.set(i,src.get(i)); } } }
Reference
https://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java
相关推荐
extends T>和List<? super T>是泛型的不同使用形式,它们在类型约束和操作上有所不同。 1. List<? extends T> - `? extends T` 是类型上界的表示,意味着列表中的元素可以是T类型或者是T的任何子类型。这种类型的...
经常发现有List<? super T>、Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。
extends Number> foo3表示foo3可以是List<Number>、List<Integer>、List<Double>等类型的列表。这种声明意味着foo3可以包含Number类型或其子类的元素。 super关键字 在泛型中,super关键字用于限制类型参数的下界...
extends T>和<? super T>。<? extends T>被称作上界通配符,表示该类型参数是类型T的子类或T本身。而<? super T>被称作下界通配符,表示类型参数是类型T的父类或T本身。 首先,我们来理解<? extends T>通配符。...
List<String> flavors = new ArrayList<>(); Collections.addAll(flavors, "Peaches'nPlutonium", "RockyRacoon"); ``` 此例中,`flavors`列表将被填充上指定的字符串元素。 #### 2. `asLifoQueue` 此方法将`...
extends T> a, Stream<? extends T> b)`: 连接流 A 和流 B,返回一个新流。 简单约简 * `long count()`: 返回流中元素的数量。 * `forEach(Consumer<? super T> action)`: 对流中元素依次进行操作。 * `boolean ...
extends Fruit>`可以视为`Plate<Fruit>`及`Plate<Apple>`等所有`Fruit`的子类的容器的共同基类。这样就可以将`Plate<Apple>`实例赋值给`Plate<? extends Fruit>`类型的变量: ```java Plate<? extends Fruit> p = ...
extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。 extends List<? extends Number> foo3的通配符声明,意味着以下的赋值是合法的: // Number "extends" Number (in...
extends T>`表示可以接受T或T的任何子类型,而`<? super T>`则表示可以接受T或T的任何超类型。这些通配符在方法参数中尤其有用,允许方法处理特定类型范围的对象。 6. 捕获通配符: 在方法签名中,可以使用多个...
super T> predicate)`: 过滤满足条件的元素。 - `map(Function<? super T, ? extends R> mapper)`: 将每个元素转换为另一种类型。 - `flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)`: 将...
extends T> coll) / min(Collection<? extends T> coll)`: 返回集合中的最大/最小元素,元素需实现Comparable接口或传递Comparator。 - `shuffle(List<?> list, Random r)`: 随机打乱列表中的元素顺序,可指定...
在集合的并发处理方面,Collections提供了`synchronizedList(List<T> list)`、`synchronizedSet(Set<T> set)`等方法,返回线程安全的集合视图,适合多线程环境。但要注意,这些同步集合只是保证基本的线程安全性,...
public void download(String url,String target,AjaxCallBack<File> callback) public void download( String url,AjaxParams params, String target, AjaxCallBack<? extends Object> callback) 附送请求...
super T`:表示未知型是 T 或 T 的超类型(基类)的通配符。 例如:`ArrayList<? super Shape>`,其中 `?` 表示未知型是 `Shape` 或 `Shape` 的超类型的通配符。 在使用通配符类型时,需要注意以下几点: * ...
extends T>` 表示一个可以存储任何T及其子类的对象。例如,`Plate<? extends Fruit>` 可以表示任何可以装水果或其子类的盘子,如苹果、香蕉等。这种通配符使得你可以将`Plate<Apple>`赋值给`Plate<? extends Fruit>...
> flist = new ArrayList<>(); 这里,List<?> 表示“具有任何类型的列表”,编译器无法确定 List 所持有的类型。 泛型的限制 Java 泛型中有很多限制,例如: * 不能使用基本类型作为泛型类型参数。 * 不能使用...
extends T> subList)` 和 `Collections.lastIndexOfSubList(List<T> list, List<? extends T> subList)` 用于查找子列表第一次或最后一次出现的位置。 - **二分查找**:`Collections.binarySearch(List<? extends ...
extends Optional<U>> mapper)`方法与`map()`类似,但转换的结果必须是另一个`Optional`,然后将这两个`Optional`合并成一个。如果原始`Optional`无值,或者转换函数结果为空,最终结果也是空。 6. 运算操作 - `...