Устранение неоднозначности общих функций kotlin - PullRequest
0 голосов
/ 26 февраля 2019

Фон:

Я работаю над небольшим генератором кода.Я хотел бы избежать обычной проблемы отсутствия подсказок кода перед тем, как код будет сгенерирован.Чтобы решить эту проблему, я создал общий универсальный фиктивный метод, который я намереваюсь сгенерировать.

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

Я надеялся, что компилятор выберет наиболее конкретную реализацию, но, похоже, это не так.

Есть ли способ устранения неоднозначности между этими сигнатурами?

...