Types 复杂可变映射类型
我有点糊涂了 所以,我有一个类型为的可变映射Types 复杂可变映射类型,types,kotlin,signature,mutablemap,Types,Kotlin,Signature,Mutablemap,我有点糊涂了 所以,我有一个类型为的可变映射 val converters=mutableMapOf() 我无法理解的x 我需要根据构造函数和方法在此映射中添加几个对,例如: converters[“Camera”]=::Camera到结构::convertCamera 其中第一个字段是对扩展ElemBase的构造函数的引用,例如: Camera:ElemBase 第二个是结构类上的一个方法,它引用了一个可为空的ElemBase类: fun-convertCamera(目标:KMutablePr
val converters=mutableMapOf()
我无法理解的x
我需要根据构造函数和方法在此映射中添加几个对,例如:
converters[“Camera”]=::Camera到结构::convertCamera
其中第一个字段是对扩展ElemBase
的构造函数的引用,例如:
Camera:ElemBase
第二个是结构
类上的一个方法,它引用了一个可为空的ElemBase
类:
fun-convertCamera(目标:KMutableProperty0)
当x
KFunction
可以工作,但我需要更具体的东西,其中定义了Receiver
和参数
我试过几次,比如
k功能单元>
或
k功能单元>
或
k功能单元>
每当我尝试向转换器添加任何内容时,总会出现错误
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>>)
尽管我仍然不明白KFunction*
的情况,为什么它们似乎不存在,尽管手动导入后,编译器会接受它们
在设计气味的情况下,我在这里移植了一些C++代码,如果可能的话,我想坚持原来的结构< /p>
Edit3:好的,我可能会改变设计,但出于好奇,我想知道到底发生了什么,如果你用IntelliJ写下以下代码:
val map = mutableMapOf("Camera" to (::Camera to Structure::convertCamera))
然后,您可以对赋值调用“显式指定类型”意图操作,或者对变量按“Ctrl+Q”以显示其推断的类型信息
这将为您提供以下信息:
val-map:MutableMap
KFunction0
和KFunction2
这里是Kotlin编译函数类型的一些类(分别具有0和2个参数的类)。书中:
Kotlin标准库定义了一系列接口,对应于不同数量的函数参数:Function0
(此函数不带参数)、Function1
(此函数带一个参数)等等。每个接口定义一个调用方法,调用它将执行函数
您可以用函数类型替换这些类型,并删除一些不必要的特定信息,如下所示:
val映射:可变映射单元>>
由于希望ElemBase
位于类型中而不是具体的Camera
类型中,因此可以执行以下操作:
valmap3:MutableMap单元>>
但是,您不能将KMutableProperty0
更改为KMutableProperty0
,因为此类型为,因此这将破坏示例中的赋值。就像MutableList
,它接受并生成其泛型类型,因此它不能在其泛型参数中接受子类型或超类型而不是所需的类型。如果您在IntelliJ中写下以下代码:
val map = mutableMapOf("Camera" to (::Camera to Structure::convertCamera))
然后,您可以对赋值调用“显式指定类型”意图操作,或者对变量按“Ctrl+Q”以显示其推断的类型信息
这将为您提供以下信息:
val-map:MutableMap
KFunction0
和KFunction2
这里是Kotlin编译函数类型的一些类(分别具有0和2个参数的类)。书中:
Kotlin标准库定义了一系列接口,对应于不同数量的函数参数:Function0
(此函数不带参数)、Function1
(此函数带一个参数)等等。每个接口定义一个调用方法,调用它将执行函数
您可以用函数类型替换这些类型,并删除一些不必要的特定信息,如下所示:
val映射:可变映射单元>>
由于希望ElemBase
位于类型中而不是具体的Camera
类型中,因此可以执行以下操作:
valmap3:MutableMap单元>>
但是,您不能将KMutableProperty0
更改为KMutableProperty0
,因为此类型为,因此这将破坏示例中的赋值。与MutableList
一样,它接受并生成其泛型类型,因此它不能在其泛型参数中接受子类型或超类型而不是所需的类型