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)