我在这里有点困惑。
所以,我有一个 mutableMap 类型
val converters = mutableMapOf<String, Pair<KFunction<ElemBase>, x>>()
我想不通的地方x
我需要根据构造函数和方法向此映射添加几对,例如:
converters["Camera"] = ::Camera to Structure::convertCamera
其中第一个字段是对扩展构造函数的引用ElemBase
,例如:
Camera : ElemBase
第二个是Structure
引用可空ElemBase
类的类上的方法:
fun convertCamera (dest: KMutableProperty0<Camera?>)
什么时候x
KFunction<*>
有效,但我需要更具体的东西,在哪里Receiver
定义参数。
我尝试了几次尝试,例如
KFunction<Structure.(KProperty1<Structure, ElemBase>) -> Unit>
或者
KFunction<(KMutableProperty0<ElemBase>) -> Unit>
或者
KFunction<Structure.(KMutableProperty0<ElemBase?>) -> Unit>
每当我尝试添加任何内容时,我总是会出错converters
Error:(276, 9) Kotlin: Type inference failed: Cannot infer type parameter V in operator inline fun <K, V> MutableMap<K, V>.set(key: K, value: V): Unit
None of the following substitutions
receiver: MutableMap<String, Pair<Int, KFunction<Structure.(KMutableProperty0<ElemBase?>) -> Unit>>> arguments: (String,Pair<Int, KFunction<Structure.(KMutableProperty0<ElemBase?>) -> Unit>>)
receiver: MutableMap<String, Pair<KFunction0<Camera>, KFunction2<Structure, @ParameterName KMutableProperty0<Camera>, Unit>>> arguments: (String,Pair<KFunction0<Camera>, KFunction2<Structure, @ParameterName KMutableProperty0<Camera>, Unit>>)
can be applied to
receiver: MutableMap<String, Pair<Int, KFunction<Structure.(KMutableProperty0<ElemBase?>) -> Unit>>> arguments: (String,Pair<KFunction0<Camera>, KFunction2<Structure, @ParameterName KMutableProperty0<Camera>, Unit>>)
但到目前为止还没有运气
有趣的是,如果我分配::Camera to Structure::convertCamera
给一个变量,我会得到以下类型:
Pair<KFunction0<ElemBase>, KFunction2<Structure, @ParameterName KMutableProperty0<ElemBase>, Unit>>
但我也KFunction0
没有KFunction2
......这到底是什么?
编辑:找到这个
Edit2:如果我手动导入KFunction0
,KFunction2
它似乎不再抱怨它们了。但如果我点击它们,它无法解决..
我尝试手动导入KFunction0
和KFunction2
,复制我在将这对分配给 a 时看到的类型var
,看起来这是有效的:
val converters = mutableMapOf<String, Pair<KFunction0<Camera>, KFunction2<Structure, KMutableProperty0<Camera>, Unit>>>()
但不是对应的ElemBase
版本:
val converters = mutableMapOf<String, Pair<KFunction0<ElemBase>, KFunction2<Structure, KMutableProperty0<ElemBase>, Unit>>>()
Error:(277, 9) Kotlin: Type inference failed: Cannot infer type parameter V in operator inline fun <K, V> MutableMap<K, V>.set(key: K, value: V): Unit
None of the following substitutions
receiver: MutableMap<String, Pair<KFunction0<ElemBase>, KFunction2<Structure, KMutableProperty0<ElemBase>, Unit>>> arguments: (String,Pair<KFunction0<ElemBase>, KFunction2<Structure, KMutableProperty0<ElemBase>, Unit>>)
receiver: MutableMap<String, Pair<KFunction0<Camera>, KFunction2<Structure, @ParameterName KMutableProperty0<Camera>, Unit>>> arguments: (String,Pair<KFunction0<Camera>, KFunction2<Structure, @ParameterName KMutableProperty0<Camera>, Unit>>)
can be applied to
receiver: MutableMap<String, Pair<KFunction0<ElemBase>, KFunction2<Structure, KMutableProperty0<ElemBase>, Unit>>> arguments: (String,Pair<KFunction0<Camera>, KFunction2<Structure, @ParameterName KMutableProperty0<Camera>, Unit>>)
虽然我仍然不明白发生了什么KFunction*
,但为什么它们似乎不存在,尽管一旦手动导入,编译器就会接受它们
如果设计有异味,我会在这里移植一些 c++ 代码,如果可能的话,我想坚持原来的结构
Edit3:好的,我可能会改变设计,但出于好奇,我还是想知道发生了什么