怎样理解java中Function<? super V, ? extends T>这样的声明?

小白刚学java,有点C++基础,core java 10看到泛型这一章觉得和C++的泛型差别太过巨大,理解非常费劲,语法看着也及其别扭,JDK的有些API有些函数声明都看不懂。。。
比如Comparator里面的这个方法:
public static Comparator comparing(
Function<? super T, ? extends U> keyExtractor, Comparator<? super U> keyComparator)
怎么理解Function<? super T, ? extends U>这个声明呢,网上查了半天都在讲生产者消费者的的准则,
但好像和这个又对不上号,苦思冥想快2天了。。。求解
PS:还有为啥我觉得java的泛型系统像是个半成品,好多莫名其妙的限制啊!!??

8个回答

再补充下,为什么参数是super返回值是extends
如果我们把函数想象成一个机器,比如面包机
参数是它需要的原料,比如白面粉
返回值是它能做的成品,比如面包

显然,对于原料我们需要提供的是白面粉或者它的派生类,比如一级白面粉、xx牌白面粉……但是如果是黑面粉,或者大米,这个面包机都不能工作。
而对于结果,恰恰相反,如果你要一个面包,这个机器能满足你,如果你要点心,也没有问题,任何基类都没有问题。但是如果你要切片面包或者法国面包,这个机器未必能满足你的要求了。

类似的,对于定义Lambda寒暑,我们需要让参数“严格”,用super,只能是派生类。对于返回值,我们需要让参数“宽松”,用extends,必须是基类。

qq52878691
qq52878691 有点明白了,谢啦,采纳你
一年多之前 回复
caozhy
贵阳老马马善福专门编写代码的老马就是我! super是只允许派生类,也就是“严格”,参数必须严格。要面粉才能做面包,你绝对不能提供大米、粮食
一年多之前 回复
caozhy
贵阳老马马善福专门编写代码的老马就是我! 回复qq52878691: 我说的宽松,是从调用者来说,我需要食物、零食、面点、面包都可以用面包机。
一年多之前 回复
qq52878691
qq52878691 面包,不是面板,打错了
一年多之前 回复
qq52878691
qq52878691 感谢您的细心回答,但请问是不是说反了?既然参数要严格,那不是应该用extends吗?还有,返回值可以宽松又是什么道理呢,而且如果可以取任意基类应该用super啊?比如一个机器,我想让它给我生产面板,结果它只给我面粉,这样真的好嘛?能不能说的再透彻点?
一年多之前 回复

这是java 8的lambda表达式,keyExtractor是相当于一个回调函数,它的参数是T,返回U,keyComparator是另一个回调函数。
从字面理解,第一个是提取需要比较的属性,第二个是比较。

lambda表达式参考:https://www.cnblogs.com/aoeiuv/p/5911692.html

通配符: “?”就是一个占位符,它不表示任何具体的类型,而是表示符合定义规则的一个或者多个类型的一个占位标志
边界:
<? extends T> 表示上界通配符 它表示T以及T的子类, 类型最高是T
<? super T> 表示下界通配符 它表示T以及T的超类,类型最高可到Object ,最低是T
<? extends T> 表示上界通配符 它表示T以及T的子类, 类型最高是T

java的泛型系统像是个半成品
这个是因为java是编译型语言,它必须在编译的程序的时候确定类型,所以它实际上用了“类型擦除”,也就是编译的时候将泛型类型替换成实际类型了。
这么做的好处是,编译器可以充分检查类型是否匹配,比如super,它可以判断这个类型是不是你要的派生类型。同时不用修改jvm的实现,直接就能运行,因为对于jvm,它根本就看不到泛型,看到的就是替换(或者说擦除)以后的类型。
坏处就是不能在运行的时候动态加载和创造泛型出来。

设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类:

声明对象:类名<?extends 类> 对象名

定义类:类名<泛型标签 extends 类>{}

设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类:

声明对象:类名<?super 类> 对象名称

定义类:类名<泛型标签 extends类>{}

Function,这是函数式编程的核心内容。

这种泛型写法,我也见过,不过忘了啥意思,一般我还是可以推测的,T可以自己填写类型,比如String,T就代表了这个类型String,传入的继承必须这个类型,第一个难道是,传入的需要是泛型的父类?将你看的源码这里的方法贴出来,我研究研究,格式:包+类+方法名,我会自己去找

qq52878691
qq52878691 这个是jdk源码,java.util.Comparator.comparing
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
怎样理解java中Function这样的声明?
小白刚学java,有点C++基础,core java 10看到泛型这一章觉得和C++的泛型差别太过巨大,理解非常费劲,语法看着也及其别扭,JDK的有些API有些函数声明都看不懂。。。n比如Comparator里面的这个方法:npublic static Comparator comparing(nFunction keyExtractor, Comparator keyComparator)n怎么理解Function这个声明呢,网上查了半天都在讲生产者消费者的的准则,n但好像和这个又对不上号,苦思冥想快2天了。。。求解nPS:还有为啥我觉得java的泛型系统像是个半成品,好多莫名其妙的限制啊!!??
泛型中? super T和? extends T的区别
经常发现有List<? super T>、Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。
Java 泛型 ? super T 中 super 怎么 理解与 ? extends T 有何不同?
首先说一下java泛型吧,泛型是Java SE 1.5的新特性,用来在编译时做类型检查的,并且会根据泛型类型自动进行类型转换,也就是说,泛型只在编译期起作用,主要是用来保证类型安全的,编译后的class文件中是不会包含泛型的,这个大家可以将class文件反编译过来看看。 &lt;? extends T&gt;和&lt;? super T&gt;表示java泛型中的上界和下界的概念,就是说&lt;...
【java】泛型中,? extends T 与 ? super T 的区别、看法
1. List&lt;? extends T&gt;和List&lt;? super T&gt;有哪些区别? ①List&lt;? extends T&gt; ,只允许泛型为T及T的子类引用调用。比如: List&lt;? extends Number&gt; list = new ArrayList&lt;Double&gt;; 而List&lt;? super T&gt;,只允许泛型为...
java中泛型的定义:《? extends T》和《? super T》的作用和区别
《? extends T》 表示类型的上界,表示参数化类型的可能是T 或是 T的子类;《? super T》 表示类型下界,表示参数化类型是此类型的父类型,直至Object;我的理解是&amp;lt;? extends T&amp;gt;限制了除了null以外的存,可以取如下: public class Genericity {public static void main(String[] args) {Lis...
关于“《T extends Comparable《?super T》》”怎么理解的问题
配图 1、只有实现Compareable接口的类或者它的父类实现了才合法 2、Comparable&amp;lt;? super T&amp;gt;&amp;gt;: 如果Comparable的下界为T,比如A是父类B是子类,A实现了Comparable, 那么传入B时,就可以看成&amp;lt;B extends Comparable&amp;lt; ?super B &amp;gt;&amp;gt;: 表示只有B的父类或者自己实现了Compare...
? super T和? extends T的区别和应用
经常看见框架很多这样的泛型写法&amp;lt;? extends T&amp;gt;,后来终于看了相关资料才明白。 &amp;lt;? extends T&amp;gt;是指“上界通配符”,&amp;lt;? super T&amp;gt;是指下界通配符。 比较有趣,而且有点烧脑,归根结底,还是一个上下转型的问题。 举例:有3个类,animal(动物),cat(猫),dog(狗)。猫和狗都继承动物类 &amp;lt;? extends T&amp;gt...
Java泛型解惑之 extends T>和 super T>上下界限
&amp;lt;? extends T&amp;gt;和&amp;lt;? super T&amp;gt;是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念。 &amp;lt;? extends T&amp;gt;:是指 “上界通配符(Upper Bounds Wildcards)” &amp;lt;? super T&amp;gt;:是指 “下界通配符(Lower Bounds Wildcards)” 一、为什么要用通配符...
java泛型通配符 ? extends T 和 ? super T 的区别和用法
1.二者的意思 2.用法 例如,我们有多个对象,其中Cat,Dog,Chicken都是extends Animal的。 List&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;? extends Animal&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; list = new ArrayList&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;l
困扰多年的Java泛型 extends T> super T>,终于搞清楚了!
一、为什么要用通配符和边界? 使用泛型的过程中,经常出现一种很别扭的情况。 比如我们有Fruit类,和它的派生类Apple 然后有一个最简单的容器:Plate类 盘子里可以放一个泛型的”东西” 我们可以对这个东西做最简单的“放”和“取”的动作:set( )和get( )方法。 现定义一个“水果盘”,逻辑上水果盘当然可以装苹果。 但...
Java 泛型 <? super T> 中 super 怎么 理解<?与 extends> 有何不同?
Java 泛型 中 super 怎么 理解 有何不同? 问题引入: // compile error // List appList2 = new ArrayList(); // appList2.add(new Fruit()); // appList2.add(new Apple()); // appList2.add(new RedApple()); List
关于泛型中<T extends comparable>的理解
public static &lt;T extends Comparable&gt; T min(List&lt;T&gt; t); 对于上面定义的泛型方法min中,Comparable指的是一个接口而不是一个类,这点应该注重注意下。 如果想调用这个方法,最关键的是传入的T类型必须已经是实现了Comparable接口中compareTo()这个方法。 比如说下面的这个Student类: p...
Java泛型通配符extends与super
http://www.zhihu.com/question/20400700 http://www.cnblogs.com/lwbqqyumidi/p/3837629.html
Java泛型中extends和super的区别
&amp;lt;? extends Fruit&amp;gt;代表的是上界通配符,也就是说这个List中存放的对象都是Fruit以及其子类的对象,这样我们就不用因为输入的List中类型的不同而改变代码了。 上界通配符有一个特点,就是程序只知道List&amp;lt;? extends Fruit&amp;gt;中的对象是Fruit的子类的对象,但是如果Fruit的子类有很多个,那个在使用add方法的时候,就可能出现本来是List...
在java的泛型中super和extends的区别
环境 java:1.7+ 前言 主要讲的是&amp;amp;lt;? super T&amp;amp;gt; 和 &amp;amp;lt;? extends T&amp;amp;gt;的区别! 这个是我在打算封装一段通用代码时,发现经常用的&amp;amp;lt;? extends T&amp;amp;gt;,网上搜索时,发现其总是要和&amp;amp;lt;? super T&amp;amp;gt;进行比较。 从stackoverflow中看到一个很好的解释,这里记下笔记; exten
<? extends T>和<? super T>:上下界通配符的界限和使用
:是指 “上界通配符(Upper Bounds Wildcards)”:是指 “下界通配符(Lower Bounds Wildcards)” 举一个简单的例子: 1、上界通配符 三个类:红苹果类继承苹果类,苹果类继承水果类 list//表示可能是一个苹果或者苹果子类的集合所以就有了一下的这几种情况 List list1 = new ArrayList(); List list2
java泛型中的通配符 extends与super
1.java泛型中的关键字java泛型中有如下关键字: 1. ? 表示通配符类型 2. <? extends T> 既然是extends,就是表示泛型参数类型的上界,说明参数的类型应该是T或者T的子类。 3. <? super T> 既然是super,表示的则是类型的下界,说明参数的类型应该是T类型的父类,一直到object。2.示例代码public class GenericClass {
泛型中extends和super的区别
首先来说:&amp;lt; ? extends T &amp;gt; 叫 上界通配符 &amp;lt; ? super T &amp;gt;叫 下界通配符 1. 下面用代码来说明上界通配符的一些特点 public class Fruit { } public class Apple extends Fruit { } public class Banana extends F...
泛型中的extends和super的区别
在网上看到如下代码,不知道为什么报错,代码如下: public class GenericTest { public static void main(String[] args) throws Exception { List f0=new ArrayList(); f0.add(new Apple());
Java之范型强化之extends与super
1、背景,本来范型类掌握的就很low,结果怕什么来什么 2、问题:&lt;E&gt;与&lt;E extends Comparable&lt;E&gt;&gt;有什么区别? 答:好吧,本来范型的目的就是代指,E可以是任意类型的对象,但是这时候加了一个E extends Comparable,明显对E做了限制,什么限制呢? E extends Comparable的意思是:E必须为扩展C...
Java中 this 和 super 关键字理解
首先还是来看一下例子:package thisExample;public class Student { private String name; private Long id; public Student () { } public Student (Long id) { this(); this.id = id; } public Student (Lon
Java泛型三:通配符详解extends super
[TOC] 在java泛型中,? 表示通配符,代表未知类型,< ? extends Object>表示上边界限定通配符,< ? super Object>表示下边界限定通配符。? 与 T 的区别T:作用于模板上,用于将数据类型进行参数化,不能用于实例化对象。 ?:在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义。< T > 等同于 < T extends Object>
一句话弄懂Java泛型 extends 和 super
之前一直用有道笔记,记录的东西都是只要自己看得懂就行了,现在尝试写文章,发表一下自己的一点点见解,可能有很多不足之处 废话不多说,开始正文 &amp;amp;lt;? extends E&amp;amp;gt; 上限通配符,用来限制类型的上限 &amp;amp;lt;? super E&amp;amp;gt; 下限通配符,用来限制类型的下限 先举几个类的例子: 基类: A A的子类: A1, A2 A的孙子类(A1的子类): B B的子类: B...
java泛型:通配符详解extends super
在java泛型中,? 表示通配符,代表未知类型,&amp;lt; ? extends Object&amp;gt;表示上边界限定通配符,&amp;lt; ? super Object&amp;gt;表示下边界限定通配符。 实例化泛型对象,我们不能够确定eList存储的数据类型是Integer还是Long,因此我们使用List&amp;lt; ? extends Number&amp;gt;定义变量的类型。 List&amp;lt; ? exte...
从extends和super浅谈java泛型
从extends和super浅谈java泛型泛型是从jdk 1.5之后引入的,对于开发者而言,使用泛型能够写出更加自然的代码,对于编写一些通用的类尤为有用。想象一下,如果没有泛型的支持,我们在要实现一个Integer类型的链表时,不能直接复用系统的List泛型类的各种子类,而必须自己继承List实现一个专门存储Integer类型元素的链表,特别麻烦不说,当这种链表数量多了,我们代码中会有很多这种类型
java 泛型 extends 和 super快速记忆。
java 泛型 extends 和 super快速记忆。 为了方便总结的更全面一点,Demo如下: public class A { } public class B extends A { } public class C extends B { } 这里全部以B为临街,看看上下界到底是什么情况 第一种情况,不带任何通配符,extends 和 super Array...
java super的理解
附上两段代码,为啥运行结果不一样,[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/13.gif][/img]rn[code=java]class ffrnrn protected int a=3;rnrnclass zz extends ffrnrn //private int a;rn zz()rn rn a=4;rn rn public void show()rn rn System.out.println(super.a);rn rn public static void main(String[] args)rn rn new zz().show();rn rn[/code]rnrn[code=java]class ffrnrn protected int a=3;rnrnclass zz extends ffrnrn zz()rn rn a=4;rn rn public void show()rn rn System.out.println(super.a);rn rn public static void main(String[] args)rn rn new zz().show();rn rn[/code]
我对Java中extends和implements的理解
第一点: extends 是继承另一个类,而且是但继承。 implements是实现一个接口,但是可以同时实现多个接口。 第二点: extends继承另一个类,那个被集成的类可以使抽象类,也可以不是抽象类。如果是抽象类并且拥有抽象方法,那么子类中必须重写所有的抽象方法,选择性的重写其他非抽象方法;如果是抽象类但是没有抽象方法,那就只是继承而已,选择性重写父类中的方法。 implement...
泛型通配符extends与super的区别
泛型通配符extends与super的区别 &amp;lt;? extends T&amp;gt; 限定参数类型的上边界:参数类型必须是T或T的子类型 &amp;lt;? super T&amp;gt; 限定参数类型的下边界:参数类型必须是T或T的超类型 一、Demo类图 二、Demo代码 import java.util.ArrayList; import java.util.List; im...
泛型中super与extends的形象解释
//Apple Orange 都继承自Fruit类,同时Jonathan是Apple的子类    List&amp;lt;? extends Fruit&amp;gt; list = new ArrayList&amp;lt;Apple&amp;gt;();    //list.add(new Apple());Error    //list.add(new Fruit());Error       List&amp;lt;? supe...
怎样理解(function($){...})(jQuery)
本示例主要用于揭示Jquery中的(function($){...})(jQuery),欢迎下载!!!相关博客:http://blog.csdn.net/gaohuanjie/article/details/38268831
关于Java 泛型 ?extends T的问题,搞不清楚
在学习java泛型时 ,看到了泛型的一个例子rnrnList apples = new ArrayList();rnList fruits = apples;rnfruits.add(new Strawberry());rnrn其中,Fruit是父类、Apple和Strawberry是子类,add操作执行错误,给出的解释是rnrn“这个? extends T 通配符告诉编译器我们在处理一个类型T的子类型,但我们不知道这个子类型究竟是什么。因为没法确定,为了保证类型安全,我们就不允许往里面加入任何这种类型的数据。”rnrn我不明白编译器怎么会不知道这个子类型是什么呢?如果不知道的话,语句List fruits = apples;为什么不报错呢?rnrn
python中super的理解
以前对于继承的了解只限于java里简单的单继承,用了python后看到可以多继承,看到super非常懵逼,现在来记录一下super的用法 在类的继承里面super()非常常用,它解决了子类调用父类方法的一些问题,父类多次被调用时只执行一次,优化了执行逻辑 在执行子类的super时,实际上执行的是父类中的同名方法 一般super写为: python2中 super(当前类名,self).函数名() ...
Java泛型中<? extends E>和<? super E>的区别
在阅读JDK源码时经常看到这样的泛型声明和。他们有什么作用又有什么区别呢?             是 Upper Bound(上限) 的通配符,用来限制元素的类型的上限,比如 List fruits;表示集合中的元素类型上限为Fruits类型,即只能是Fruit或者Fruit的子类,因此对于下面的赋值是合理的 fruits = new ArrayList(); fruits = new
浅谈Java泛型中的<? extends E>和<? super E>的区别
引入 再说这个之前,先来看一段代码: 假设有这么几个类及其继承关系,后面的例子也用这几个类作为基础示范 class People { //人 } class Man extends People { //男人 } class Woman extends People { //女人 } class Boy extends Man { //男孩 }
怎样声明这样的函数?
我想从程序传输一个字符串数组到UnFormatString,然后带回值。rn参数有一个是字符串数组,比如:rnint UnFormatString(char *strSrc,char *keyStr,char strDes[][16]);rn这是正确的,但是,如果不确定字符串的长度如何写,char strDes[][])不对,rn谁知道如何正确声明?rnrn谢谢先
java中的继承extends
知识点1: this与super 关键字this 有两个用途:一是引用隐式参数;二是调用该类其他的构造器; 关键字super也有两个用途:一是调用超类的方法;二是调用超类的构造器; 二者调用构造器必须都放在第一行; 也就是说由于子类实例化的时候一定会调用父类的构造器(将父类实例化),所以子类中有几个构造函数,父类中就必须有几个构造函数。 注意: 抽象类其实是可以实例化的,但是他的实例...
Java中extends类的继承
Java中extends类的继承
java中的继承(extends)
/*继承  关键字:extends *  定义:    超类(superclass)是被继承的类 *          子类(subclass)   是继承超类的类 *       *       子类继承超类的格式: *            class 子类名 extends =超类名{ } *       注意 :1、子类包括了超类中的所有成员(可以调用超类的一切东西除了被private声明...
android SurfaceView详解
传送门
相关热词 c#检测非法字符 c#双屏截图 c#中怎么关闭线程 c# 显示服务器上的图片 api嵌入窗口 c# c# 控制网页 c# encrypt c#微信网页版登录 c# login 居中 c# 考试软件