三分钟直观理解入参为 Function<? super T, ? extends V> :从需求侧概念入手

本文探讨了函数接口在处理参数类型时的灵活性,以Java的Stream.map方法为例,解释了如何理解函数接口的入参和返回值类型。强调函数接口的声明实际上是对处理特定类型对象的能力的描述,入参类型应为所需类型或其超类,返回值类型则需满足特定操作需求。通过对比面向过程语言中的函数引用,帮助读者更好地理解函数接口的特性。

开门见山

Function 这一函数接口,本身就表达了对传入函数的需求说明

一个最常见的用途,就是我们已经“准备”好了传入的参数,需要一个函数来处理。建议以下例子中,可以代入 Stream.map 方法来理解,这个方法的入参就是一个函数接口 Function。

对于这个函数,最需要表达的要求(之一),就是这个函数必须能够处理我准备好的参数类型,我们假设这个类型为 Bird 。那么,这个函数实际声明的参数类型,一定必须是 Bird 的父(超)类:否则,我这个 Bird 就传不进去了
我们来极端理解一下:如果传入的函数的入参,其类型为 Object,那显然可以处理 Bird,符合要求;反之,如果这个类型是 BirdWithManyFeature,那显然就没办法处理我的需求,不符合要求。

返回值的类型也可以这么理解。对于函数接口 Function,我需要对其返回对象进行的操作是明确的,这个对象必须具备 类型 V 的某些特质,但具体是哪个子类就无所谓了。


简而言之:

  • 声明一个函数(方法),就像是,我声明了以下这类代码可以处理某一类 (例如 InputClass)的对象,具体地,你给我 AnyClass extends InputClass 都是满足 InputClass 的要求;
  • 声明一个函数接口,就像是,我要处理某个对象 T,你给我的函数必须要能处理这个 T,因此你这个函数的入参比如是 T 的父(超)类,具体是 Object 还是别的什么,只要能处理 T 的都行,所以是 ? super T。

后记:
写此文的目的,是因为函数接口这一特性,看似与一些面向过程语言中的“函数引用”类似,但其实又根本不同。对于已经理解或熟练使用的人,恐怕不屑于多费唇舌,因此经常使用一些“严格”、“宽松”这样略显抽象的字眼,让像我这样的门外小白摸不着头脑。但如果将“接口”与“需求说明”这样的概念对比起来,再结合例如 Stream.map 这样常见的典型案例来理解,就很容易消化了。

`Function<? super T, ? extends U>` 是 Java 泛型中使用通配符的一种函数式接口类型声明。下面详细解释其含义: ### 泛型通配符说明 - `? super T`:表示类型下限通配符。在这个函数式接口中,`? super T` 作为 `Function` 接口的第一个类型数,意味着该函数的输数类型可以是 `T` 或者 `T` 的父类。这使得该函数可以接受更宽泛的输类型,只要满足是 `T` 及其父类即可。根据引用[1]的说明,使用 `? super T` 不影响泛型类内约束的类型变量的写,即可以向其传递 `T` 和 `T` 的子类对象。 - `? extends U`:表示类型上限通配符。作为 `Function` 接口的第二个类型数,意味着该函数的返回值类型是 `U` 或者 `U` 的子类。这限制了函数返回值的类型范围,只能是 `U` 及其子类。 ### 整体含义 `Function<? super T, ? extends U>` 表示一个函数式接口,该接口的抽象方法接受一个类型为 `T` 或 `T` 的父类的数,并返回一个类型为 `U` 或 `U` 的子类的结果。这种声明方式增加了函数的灵活性和通用性,允许函数处理更广泛的输类型,并返回特定类型或其子类型的结果。 ### 代码示例 ```java import java.util.function.Function; class Animal {} class Dog extends Animal {} class Puppy extends Dog {} class Food {} class DogFood extends Food {} public class FunctionExample { public static void main(String[] args) { // 定义一个 Function 实例,输为 Dog 或其父类,返回为 Food 或其子类 Function<? super Dog, ? extends Food> dogFeeder = dog -> new DogFood(); // 可以传 Dog 或其子类 Food food = dogFeeder.apply(new Puppy()); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值