?super T 和? extends T区别

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》
时间: 2024-10-11 18:30:53

?super T 和? extends T区别的相关文章

关于Java中this和super的用法介绍和区别

1.this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的.要注意的是this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this.his也可作为构造函数来使用.在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类.super的作用同样是可

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

来源:并发编程网 链接:http://ifeve.com/difference-between-super-t-and-extends-t-in-java/ 经常发现有List<? super T>.Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别. extends List<? extends Nu

java泛型中&lt;? super String&gt;和&lt;? extends String&gt; 的区别

(1)<? super String> is any class which is a superclass of String (including String itself). (In this case, the only other suitable class is Object.) 即包括String的父类和它本身的类. (2) <? extends String> (which in this specific case wouldn't be very usefu

Java 范型中的super和extends的区别

其实一句话就是: super最好用来作为输出参数,extends最好用来作为输入参数: 看看下面的例子: private class A { // } private class B extends A { // } private class C extends B { // } public void test() { List<? super B> test = new ArrayList(); test = new ArrayList<A>(); test = new Ar

Difference between &lt;? super T&gt; and &lt;? extends T&gt; in Java

I love the answer from @Bert F but this is the way my brain sees it. I have an X in my hand. If I want to write my X into a List, that List needs to be either a List of X or a List of things that my X can be upcast to as I write them in i.e. any supe

java ? super E 和 ? extends E

/** * 泛型固定下边界 * ? super E * * 泛型固定上边界 * ? extends E */ public static void main(String[] args) { //demo1(); TreeSet<Student> ts1 = new TreeSet<>(new CompareByAge()); ts1.add(new Student("张三", 33)); ts1.add(new Student("李四",

implements和extends的区别

extends可以理解为全盘继承了父类的功能 implements可以理解为为这个类附加一些额外的功能 举个例子,Animal是一个父类,cat,dog,bird,insect都extends了Animal, 但是cat,dog,bird还可以implements比如run,shout这些interface,bird,insect可以implements比如fly这些interface extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中

[super class] 和 [self superclass] 区别

#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"super class %@",[super class]); NSLog(@"super class %@",[super class]); } 2014-12-

Java泛型_上界extends_下界super

?Java泛型_上界extends_下界super ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T或是T的子类 <? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型(T)的超类型(父类型),直至Object 当使用 Upper Bound 通配符时 如下代码, /**  * 代码中通配符<?> 是 <? extends Object> 的简写  *  * @param list