Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 解决超负荷分辨模糊问题_Kotlin - Fatal编程技术网

Kotlin 解决超负荷分辨模糊问题

Kotlin 解决超负荷分辨模糊问题,kotlin,Kotlin,我不明白为什么将以下两个转换为函数会导致重载解析歧义: public fun <Fiz> Boo.into(block: FizMorphBuilder.() -> Unit): FizMorphBuilder defined in com.ltrojanowski.morph public fun <Foo> Boo.into(block: FooMorphBuilder.() -> Unit): FooMorphBuilder defined in com

我不明白为什么将以下两个
转换为
函数会导致
重载解析歧义:

public fun <Fiz> Boo.into(block: FizMorphBuilder.() -> Unit): FizMorphBuilder defined in com.ltrojanowski.morph
public fun <Foo> Boo.into(block: FooMorphBuilder.() -> Unit): FooMorphBuilder defined in com.ltrojanowski.morph
public fun Boo.into(block:FizMorphBuilder.(->单位):com.ltrojanowski.morp中定义的FizMorphBuilder
public fun Boo.into(block:foorphbuilder.(->Unit):在com.ltrojanowski.morp中定义的foorphbuilder
当我显式地指定类型
boo.into{}.morph()
时,为什么kotlin不知道给定的类型参数要选择哪一个

类生成器( 变量a:字符串?, 变量b:双?, 变量c:Int?, 变量d:浮动?, 变量e:列表? ):变形生成器{ 重写fun morph():Foo=Foo(a=a!!,b=b!!,c=c!!,d=d!!,e=e!!) } fun Boo.into(block:foorphbuilder.(->Unit):foorphbuilder=foorphbuilder(this.a, 应用(块)

类FizMorphBuilder(
变量a:字符串?,
变量b:双?,
变量c:Int?,
变量d:浮动?,
变量e:列表?
):变形生成器{
重写有趣的变形():Fiz=Fiz(a=a!!,b=b!!,c=c!!,d=d!!,e=e!!)
}
fun Boo.into(block:FizMorphBuilder.(->单位):FizMorphBuilder=FizMorphBuilder(this.a,
应用(块)

我能以某种方式解决这个问题吗?

从JVM的角度来看,在类型擦除之后,函数具有相同的类型,它类似于(在Java中):

public作废到(Boo-Boo,功能1块);
在JVM级别,这种解析不考虑函数返回类型

对每个方法使用带有不同参数的
@JvmName(“唯一名称”)
注释,要求Kotlin编译器在JVM级别为方法生成唯一名称


UPD:这些函数不需要通用参数,即
。在声明中不使用它们,Kotlin编译器也无法推断类型

UPD2: 编译器将无法猜测您调用的lambda的类型,因此您可能也需要显式指定它的类型,例如

val builder : FizMorphBuilder.() -> Unit = { /*the builder lambda */ }
val z = Boo().into(builder)

我们使用带有显式类型的声明来解释此时需要的确切生成器lambda签名。

从JVM的角度来看,函数在类型擦除后具有相同的类型,它类似于(在Java中):

public作废到(Boo-Boo,功能1块);
在JVM级别,这种解析不考虑函数返回类型

对每个方法使用带有不同参数的
@JvmName(“唯一名称”)
注释,要求Kotlin编译器在JVM级别为方法生成唯一名称


UPD:这些函数不需要通用参数,即
。在声明中不使用它们,Kotlin编译器也无法推断类型

UPD2: 编译器将无法猜测您调用的lambda的类型,因此您可能也需要显式指定它的类型,例如

val builder : FizMorphBuilder.() -> Unit = { /*the builder lambda */ }
val z = Boo().into(builder)

我们使用带有显式类型的声明来解释此时需要的确切生成器lambda签名。

Hmm。。。我想我做错了什么,但是当我添加
JvmName(name=“intoFooFromBoo”)
JvmName(name=“intoFizFromBoo”)
时,我仍然会遇到同样的错误。我没有正确理解您吗?您不需要通用参数,例如
嗯。。。我想我做错了什么,但是当我添加
JvmName(name=“intoFooFromBoo”)
JvmName(name=“intoFizFromBoo”)
时,我仍然会遇到同样的错误。我没有正确理解您的意思吗?您不需要通用参数,例如
val builder : FizMorphBuilder.() -> Unit = { /*the builder lambda */ }
val z = Boo().into(builder)