java吧 关注:1,270,350贴子:12,776,213
  • 12回复贴,共1

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

只看楼主收藏回复

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


IP属地:江西1楼2018-01-20 22:44回复
    ?super T是说 这个参数可以是T或者是T的父类,?extends U是说这个参数可以是U或者U的子类。U也可以是个接口


    IP属地:广东来自Android客户端2楼2018-01-20 23:04
    收起回复
      2025-07-21 12:12:43
      广告
      你可以把那个方法复制过来,然后去掉里面的? super extends ,你会发现只能传入指定的T,U类型参数。但是原始方法可以传入更多的类型。


      来自Android客户端3楼2018-01-21 11:41
      回复
        是问super还是extends还是什么


        IP属地:浙江来自Android客户端4楼2018-01-21 11:45
        回复
          他定义就是这样,有啥问题啊.方便你开发而已.
          就像1.8出的4大基本函数接口,就是为了方便你写闭包,写回调.省得你自己手动写那4个接口.
          你看下这个方法这个function接口的参数定义
          * @param keyExtractor the function used to extract the sort key
          你可以在外部业务类使用该Comparator的thenComparing方法时,实现该function,然后在thenComparing中调用啊,泛型只是为了写代码更规范,让编译器能认识这个类型,方便开发


          IP属地:浙江5楼2018-01-21 12:04
          回复


            实现和结果


            IP属地:浙江6楼2018-01-21 12:20
            回复

              至于U的效果,就是如图所示了,规范开发,方便API调用者更好的调用API而已


              IP属地:浙江7楼2018-01-21 12:28
              回复