バックグラウンド:
私は小さなコードジェネレーターに取り組んでいます。コードが実際に生成される前にコードヒントがないという通常の問題を回避したいと思います。これを解決するために、生成しようとしている種類の一般的な汎用ダミー メソッドを作成しました。
inline fun <R: Any> Any.into(block: MorphBuilder<R>.() -> Unit): MorphBuilder<R> {
throw IllegalStateException("Didn't generate extension method")
}
これにより、アイデアのヒントが提供されます。実際の特定のメソッドが生成された後
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
コンパイラが最も具体的な実装を選択することを望んでいましたが、そうではないようです。
これらの署名を明確にする方法はありますか?