[英]Functional Interface Object Cast
我在Java项目中遇到了以下代码,但不确定该怎么做:
public Function<CustomEnum,String> foo(SomeObject someObject) {
return ((Function<CustomEnum,String>) (someObject::toString)).andThen(r -> someObject::getSomethingWithEnumParameter);
}
我不太了解如何将某些内容投射到功能接口。 那有什么意思?
返回值的结果类型不是someObject的任何值。
Function<CustomEnum, String>
是否不是定义一个采用CustomEnum
类型并返回String
的匿名函数?
我已经阅读了Function<T,R>
的Java文档,说实话,这与阅读文档之前没有多大关系。
我相信这是正在发生的事情。
foo返回一个匿名函数,该函数应用于某些CustomEnum
以返回字符串
FOO的内部匿名函数(这是某种投射到someObject::toString
,这一点我不明白)被应用到CustomEnum
将从最初的呼叫传递foo(someObject).apply(customEnum)
andThen
将从foo内部的匿名函数中获取结果String(我仍然不理解它是否已被someObject::getSomethingWithEnumParameter
),然后返回someObject::getSomethingWithEnumParameter
的值。 为什么返回类型不只是someObject::getSomethingWithEnumParameter
的类型,为了便于讨论,我们将其称为Map<R,T>
。
如果有人可以帮助我理解这一流程,我将不胜感激。
在理想的世界中,这将起作用:
public Function<CustomEnum,String> foo(SomeObject someObject) {
return (someObject::toString).andThen(...);
}
但是,Java需要接口类型,以便从方法引用隐式创建接口实例。因此,需要显式强制类型转换才能转换为Function接口类型。
一旦有了Function的实例,就可以按常规调用其上的任何方法,在这种情况下, andThen
方法将其与另一个函数对象组成一个新函数。
分解:
someObject::toString
是隐式类型为Function<CustomEnum, String>
的方法引用。 即toString
是上一个方法SomeObject
这需要类型的参数CustomEnum
并返回String
。
r -> someObject::getSomethingWithEnumParameter
具有错误的类型-它是一个返回函数的函数。 如果你摆脱了“ r ->
”部分,那么它是有效的,只要someObject::getSomethingWithEnumParameter
是一个方法SomeObject
,需要一个String
,并返回一个String
。 或者, foo
的返回类型将需要更改为Function<CustomEnum, Function<String, String>>
。
如果将这两个与andThen
结合使用,那么您将拥有一个接受CustomEnum
并返回String
的Function
,作为pr的返回类型foo
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.