1

背景:

我正在开发一个小型代码生成器。我想避免在实际生成代码之前没有代码提示的常见问题。为了解决这个问题,我创建了一个我打算生成的通用虚拟方法。

inline fun <R: Any> Any.into(block: MorphBuilder<R>.() -> Unit): MorphBuilder<R> {
    throw IllegalStateException("Didn't generate extension method")
}

这将在 ide 中提供提示。实际生成后具体方法

class FooMorphBuilder(
    var a: String?,
    var b: Double?,
    var c: Int?,
    var d: Float?,
    var e: List<String>?
) : MorphBuilder<Foo> {
    override fun morph(): Foo = Foo(a!!, b!!, c!!, d!!, e!!)
}

inline fun <Foo> Boo.into(block: FooMorphBuilder.() -> Unit): FooMorphBuilder =
        FooMorphBuilder(this.a, this.b, this.c, this.d, this.e)

应该使用它们。

问题:

不幸的是,这会导致以下错误。

 Overload resolution ambiguity: 
public inline fun <Foo> Boo.into(block: FooMorphBuilder.() -> Unit): FooMorphBuilder defined in com.example.morph
public inline fun <R : Any> Any.into(block: MorphBuilder<com.example.morph.Foo>.() -> Unit): MorphBuilder<com.example.morph.Foo> defined in com.example.morph

我希望编译器会选择最具体的实现,但似乎并非如此。

有没有办法消除这些签名之间的歧义?

4

0 回答 0