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")