`

Difference between <? super T> and <? extends T>

    博客分类:
  • Java
 
阅读更多

原创转载请注明出处: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

 

 

分享到:
评论

相关推荐

    Java中List<? extends T>与List<? super T>的区别(值得珍藏)

    extends T&gt;和List&lt;? super T&gt;是泛型的不同使用形式,它们在类型约束和操作上有所不同。 1. List&lt;? extends T&gt; - `? extends T` 是类型上界的表示,意味着列表中的元素可以是T类型或者是T的任何子类型。这种类型的...

    泛型中? super T和? extends T的区别

    经常发现有List&lt;? super T&gt;、Set&lt;? extends T&gt;的声明,是什么意思呢?&lt;? super T&gt;表示包括T在内的任何T的父类,&lt;? extends T&gt;表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。

    泛型中extends和super的区别Java系列2021.pdf

    extends Number&gt; foo3表示foo3可以是List&lt;Number&gt;、List&lt;Integer&gt;、List&lt;Double&gt;等类型的列表。这种声明意味着foo3可以包含Number类型或其子类的元素。 super关键字 在泛型中,super关键字用于限制类型参数的下界...

    简单粗暴一文彻底搞懂Java泛型中的PECS原则(在坑里躺了多年终于爬出来了).md

    extends T&gt;和&lt;? super T&gt;。&lt;? extends T&gt;被称作上界通配符,表示该类型参数是类型T的子类或T本身。而&lt;? super T&gt;被称作下界通配符,表示类型参数是类型T的父类或T本身。 首先,我们来理解&lt;? extends T&gt;通配符。...

    collections方法集合

    List&lt;String&gt; flavors = new ArrayList&lt;&gt;(); Collections.addAll(flavors, "Peaches'nPlutonium", "RockyRacoon"); ``` 此例中,`flavors`列表将被填充上指定的字符串元素。 #### 2. `asLifoQueue` 此方法将`...

    【Java基础笔记】Java集合流Stream.docx

    extends T&gt; a, Stream&lt;? extends T&gt; b)`: 连接流 A 和流 B,返回一个新流。 简单约简 * `long count()`: 返回流中元素的数量。 * `forEach(Consumer&lt;? super T&gt; action)`: 对流中元素依次进行操作。 * `boolean ...

    java中泛型上下界问题基本问题的介绍

    extends Fruit&gt;`可以视为`Plate&lt;Fruit&gt;`及`Plate&lt;Apple&gt;`等所有`Fruit`的子类的容器的共同基类。这样就可以将`Plate&lt;Apple&gt;`实例赋值给`Plate&lt;? extends Fruit&gt;`类型的变量: ```java Plate&lt;? extends Fruit&gt; p = ...

    Java泛型中? super T和? extends T的区别

    extends T&gt;表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。  extends  List&lt;? extends Number&gt; foo3的通配符声明,意味着以下的赋值是合法的:  // Number "extends" Number (in...

    使用通配符简化泛型使用1

    extends T&gt;`表示可以接受T或T的任何子类型,而`&lt;? super T&gt;`则表示可以接受T或T的任何超类型。这些通配符在方法参数中尤其有用,允许方法处理特定类型范围的对象。 6. 捕获通配符: 在方法签名中,可以使用多个...

    JAVA 8 Stream 4.rar

    super T&gt; predicate)`: 过滤满足条件的元素。 - `map(Function&lt;? super T, ? extends R&gt; mapper)`: 将每个元素转换为另一种类型。 - `flatMap(Function&lt;? super T, ? extends Stream&lt;? extends R&gt;&gt; mapper)`: 将...

    集合工具类Collections的基本应用

    extends T&gt; coll) / min(Collection&lt;? extends T&gt; coll)`: 返回集合中的最大/最小元素,元素需实现Comparable接口或传递Comparator。 - `shuffle(List&lt;?&gt; list, Random r)`: 随机打乱列表中的元素顺序,可指定...

    559.557.JAVA基础教程_集合-Collections工具类常用方法的测试(559).rar

    在集合的并发处理方面,Collections提供了`synchronizedList(List&lt;T&gt; list)`、`synchronizedSet(Set&lt;T&gt; set)`等方法,返回线程安全的集合视图,适合多线程环境。但要注意,这些同步集合只是保证基本的线程安全性,...

    android好用的框架(封装了数据库,注解,网络,图片缓存的框架)

    public void download(String url,String target,AjaxCallBack&lt;File&gt; callback) public void download( String url,AjaxParams params, String target, AjaxCallBack&lt;? extends Object&gt; callback) 附送请求...

    java中通配符使用以及intellij-idea实例

    super T`:表示未知型是 T 或 T 的超类型(基类)的通配符。 例如:`ArrayList&lt;? super Shape&gt;`,其中 `?` 表示未知型是 `Shape` 或 `Shape` 的超类型的通配符。 在使用通配符类型时,需要注意以下几点: * ...

    K_Generic--Bounds Wildcards知乎回答1

    extends T&gt;` 表示一个可以存储任何T及其子类的对象。例如,`Plate&lt;? extends Fruit&gt;` 可以表示任何可以装水果或其子类的盘子,如苹果、香蕉等。这种通配符使得你可以将`Plate&lt;Apple&gt;`赋值给`Plate&lt;? extends Fruit&gt;...

    Java泛型三篇文章,让你彻底理解泛型(super ,extend等区别)

    &gt; flist = new ArrayList&lt;&gt;(); 这里,List&lt;?&gt; 表示“具有任何类型的列表”,编译器无法确定 List 所持有的类型。 泛型的限制 Java 泛型中有很多限制,例如: * 不能使用基本类型作为泛型类型参数。 * 不能使用...

    Collections Framework中的算法(之一)――综述

    extends T&gt; subList)` 和 `Collections.lastIndexOfSubList(List&lt;T&gt; list, List&lt;? extends T&gt; subList)` 用于查找子列表第一次或最后一次出现的位置。 - **二分查找**:`Collections.binarySearch(List&lt;? extends ...

    Optional 使用方法详解

    extends Optional&lt;U&gt;&gt; mapper)`方法与`map()`类似,但转换的结果必须是另一个`Optional`,然后将这两个`Optional`合并成一个。如果原始`Optional`无值,或者转换函数结果为空,最终结果也是空。 6. 运算操作 - `...

Global site tag (gtag.js) - Google Analytics