泛型里的super和extend

<? extends T>和<? super T>应该怎么用?

网上看到一些比较难懂的回答,但是在EffectiveJava(2th Edition)遇到简单明了的解释:

If your parameter is a producer, it should be <? extends T>, if it‘s a consumer it has to be <? super T>

即,做生产者的方法的参数用extends,消费者的方法的参数用super。

这里翻译一下:

<? extends T> 为 T的某个子类型 的 类

<? super T> 为 T的某种超类 的 类

时间: 2024-10-13 20:22:59

泛型里的super和extend的相关文章

java泛型中的super和extend

List<? extend Fruit> list=new ArrayList<>();  解释为:集合中元素是继承自Fruit,究竟是何种类型,编译器也无法判定. 如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? extends 通配符:(Producer Extends) List<? super Apple> list=new ArrayList<>();解释为:集合中的元素是Apple的父类,无法判定具体类型. 如果要从集合中写入类型T的数

java 泛型通配符 extends, super

引自:http://sharewind.iteye.com/blog/1622164 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 <? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object extends 示例 static class Food{} static class Fruit extends Food{} static clas

Android开发之深入理解泛型extends和super的区别

摘要: 什么是泛型?什么是擦除边界?什么是上界限定或下界限定(子类型限定或超类型限定)?什么是类型安全?泛型extends关和super关键字结合通配符?使用的区别,两种泛型在实际Android开发中有什么用处? 一.什么是泛型? 泛型,大概的意思是指没有指定具体的类型的类或方法,以泛型的形式传入一个类中或方法中,在Java编程(Android编程)里面使用一对尖括号和一个大写字母表示,例如: //泛型类 public interface List<E>{} //泛型方法,类型参数位于返回类型

JAVA 泛型通配符 ? EXTENDS SUPER 的用法

1. <? extends Hero> ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型heroList 的泛型可能是HeroheroList 的泛型可能是APHeroheroList 的泛型可能是ADHero所以 可以确凿的是,从heroList取出来的对象,一定是可以转型成Hero的 但是,不能往里面放东西,因为放APHero就不满足<ADHero>放ADHero又不满足<APHero> 2.

泛型 &lt;? extends Object&gt; &lt;? super Object&gt;

参考:http://www.cnblogs.com/friends-wf/p/3582841.html ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 <? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object

Java 泛型 &lt;? super T&gt; 中 super 怎么 理解?与 extends 有何不同?

https://www.zhihu.com/question/20400700/answer/117464182 Java是单继承,所有继承的类构成一棵树. class Apple(A)class Banana(B) extend Apple(A) class Orange ()) extend Apple(A) 泛型里面A super B 表示A是B的父类或者祖先A extend B 表示A是B的子类或者子孙 由于树这个结构上下是不对称的 1) 参数写成:T<? super B>,对于这个泛

object-c里self与super的区别 (转)

self与super的区别(转) 在objc中的类实现中经常看到这两个关键字”self”和”super”,以以前oop语言的经验,拿c++为例,self相当于this,super相当于调用父类的方法,这么看起来是很容易理解的.但是它们真正是如何调用的呢? 你知道吗? 以下面的代码为例: @interface Person:NSObject {NSString*  name;}- (void) setName:(NSString*) yourName;@end@interface PersonMe

java夯实基础系列:泛型

一.概念 1.为什么需要泛型? 不使用泛型时: public class Test01 { public static void main(String[] args) { HashMap map = new HashMap(); map.put("m1", "sssss"); String str = (String)map.get("m1"); } } 使用泛型后: public class Test01 { public static vo

JAVA泛型的实现原理

1.基本学过JAVA的人都知道一点泛型,明白常出现的位置和大概怎么使用. 在类上为:class 类名<T> {} 在方法上为:public <T> void 方法名 (T x){} 就不再赘述了. 2.泛型就是将类型变成了参数去传入,使得可以使用的类型多样化,进而实现解耦. JAVA因为泛型是在1.5以后出现的,为了保持对以前版本的兼容,使用了擦除的方法实现泛型.所以比起C++等在使用上限制较多. 擦除是什么呢,实际上就是一定程度无视了类型参数T,直接从T所在的类开始向上T的父类去