Kotlin:如何处理任何输入类型和给定输出类型的函数

Kotlin:如何处理任何输入类型和给定输出类型的函数,kotlin,Kotlin,我的函数具有签名(ShellInput)->ShellOutput。对这些的引用存储在地图中: mutableMapOf<String, (ShellInput) -> ShellOutput>("trim" to ::trim) mutableMapOf ShellOutput>(“修剪”到::修剪) 然后从该映射中提取这些元素,并通过反射调用它们。现在需要具有输入类型可以变化的函数,因此我尝试: mutableMapOf<String, (Any) -> S

我的函数具有签名
(ShellInput)->ShellOutput
。对这些的引用存储在地图中:

mutableMapOf<String, (ShellInput) -> ShellOutput>("trim" to ::trim)
mutableMapOf ShellOutput>(“修剪”到::修剪)
然后从该映射中提取这些元素,并通过反射调用它们。现在需要具有输入类型可以变化的函数,因此我尝试:

mutableMapOf<String, (Any) -> ShellOutput>("trim" to ::trim)
mutableMapOf ShellOutput>(“修剪”到::修剪)

但这是行不通的。如何处理这个问题?

事实上,将
::trim
作为值放入
可变映射的ShellOutput>
会破坏类型安全性:之后从映射中取出一个值时,它被键入为
(Any)->ShellOutput
,让您将
Any
作为参数传递给函数。类型系统不允许这样做

作为一种解决方法,您可以使用类型
函数1
,这意味着参数类型未知:

mutableMapOf<String, Function1<*, ShellOutput>>("trim" to ::trim)
您可以将强制转换封装到扩展中,如下所示:

@Suppress("UNCHECKED_CAST")
fun <T> Map<String, Function1<*, ShellOutput>>.getWithParameter(key: String): 
    Function1<T, ShellOutput> = 
    get(key) as Function1<T, ShellOutput>

// Usage:
functions.getWithParameter<ShellInput>("trim")
@Suppress(“未选中的\u CAST”)
fun Map.getWithParameter(键:字符串):
功能1=
获取(键)作为函数1
//用法:
functions.getWithParameter(“trim”)


或者,使用
k功能
。它可以避免未经检查的强制转换,但从一开始就不太安全,因为它不控制参数的数量,您可以
.call(…)
这类函数引用了任意数量的任意类型的参数。

是否
trim
函数输入类型是
any
ShellOutput
作为返回语句?@StanislavBondar Nope。trim保持不变,将有另一个函数,比如trim file(FileInput)->ShellOutputWell,如果这些函数始终是函数而不是lambda,那么您可以使用
KFunction
instead@1blustone这是一个很好的观点。如果它是一个答案,我会选择它。嘿,似乎我太晚了:)虽然我从Ctrl+Q快捷方式中意识到存在
KFunction1
,但我似乎永远无法声明该类型的变量,因为该类型显然不存在。我确实有
kotlin reflect
作为依赖项。您需要显式导入它,
import kotlin.reflect.KFunction1
,但不确定IDE为什么会对completion.Wow隐藏此类型。真奇怪。如果我在文档窗口中单击,什么也不会发生。此外,根本没有提到
k功能1
。谢谢我相信,这与
KFunctionN
类型有些特殊这一事实有关,本规范文档称它们为虚构的:更新了答案:似乎
Function1
是一个更好的选择,因为它不需要这种导入。
@Suppress("UNCHECKED_CAST")
fun <T> Map<String, Function1<*, ShellOutput>>.getWithParameter(key: String): 
    Function1<T, ShellOutput> = 
    get(key) as Function1<T, ShellOutput>

// Usage:
functions.getWithParameter<ShellInput>("trim")