【发布时间】:2021-03-28 16:38:55
【问题描述】:
Function.identity() 返回一个函数,Function<T, T> 始终返回其输入参数(即身份函数)。
但是作为一个静态方法,当它甚至不接受任何输入时,它如何知道返回哪个具体参数来代替类型参数T?
我的思维过程图解:
Map idToPerson = people.collect( Collectors.toMap( (person -> person.getID() , Function.identity() ) );
问题:那么编译器如何确定Function.identity() 应该返回Function<element of 'people' stream, element of 'people' stream> 流,尽管没有输入?
根据OpenJDK,实现类似于:
static <T> Function<T, T> identity()
{
return t -> t;
}
试图缩小我的问题范围:Function.identity() 怎么知道 t -> t 中的具体数据类型 t(顺便说一句,这是 lambda Function<T, T>)是什么?
【问题讨论】:
-
<T>是一种参数。 -
类型推断的主题太宽泛了。但这正是泛型的工作方式。在您使用
Function.identity()的上下文中,编译器推断方法调用的类型参数。你也可以自己指定它们并明确Function.<Person>identity()或其他。 -
编译器找出
<T>的唯一参数,该参数将使toMap类型检查。 -
感谢您的回复,所以你们说类型要么是推断的,要么我们可以指定它。根据Java Tutorial,根据
Variable declarations, Assignments, Return statements, Array initializers, Method or constructor arguments, Lambda expression bodies, Conditional expressions, ?:, Cast expressions,推断类型 -
我能知道在这种情况下,我们在这里使用哪种情况进行类型推断?
标签: java generics java-stream type-inference