复杂的mutableMap类型



我在这里变得有些困惑。

所以,我有一个类型的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:如果我手动导入KFunction0KFunction2,似乎不再抱怨它们了。但是,如果我单击它们,它将无法解决。

我试图手动导入KFunction0KFunction2,在将这对分配给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:好的,我可能会更改设计,但是我想找出发生的事情,为了好奇心

如果在Intellij中写下以下代码:

val map = mutableMapOf("Camera" to (::Camera to Structure::convertCamera))

然后,您可以在分配上调用"明确指定类型"意图操作,或在变量上按" ctrl q",以提出其类型信息。

这使您有以下内容:

val map: MutableMap<String, Pair<KFunction0<Camera>, KFunction2<Structure, @ParameterName(name = "dest") KMutableProperty0<Camera?>, Unit>>>

KFunction0KFunction2这是Kotlin将功能类型编译为(分别具有0和2个参数的类型(的一些类。来自 kotlin in Action 书籍:

kotlin标准库定义了一系列接口,对应于不同数量的函数参数: Function0<R>(此函数不采用参数(, Function1<P1, R>(此函数获取一个参数(,依此类推。每个接口都定义了一个单个调用方法,调用将执行该函数。

您可以改用功能类型替换它们,然后删除一些不必要的特定信息,例如:

val map: MutableMap<String, Pair<() -> Camera, (Structure, KMutableProperty0<Camera?>) -> Unit>>

由于您希望ElemBase在类型中而不是混凝土Camera类型中,因此可以做到这一点:

val map3: MutableMap<String, Pair<() -> ElemBase, (Structure, KMutableProperty0<Camera?>) -> Unit>>

但是,由于这种类型是不变的,因此您无法将KMutableProperty0<Camera>更改为KMutableProperty0<ElemBase>,因此这将打破示例中的分配。就像 MutableList<T>一样,它既接受并产生其通用类型,因此它不能在其通用参数中接受子类型或supertype而不是所需的参数。

最新更新