概要
APIから返ってきたレスポンス(Entity)をModelに変換する際、converterをEntityの拡張メソッドで定義している。
1Entityが複数のリストを返してきて、その変換処理を定義しようとしたら少し解決に時間がかかったのでメモ
まとめ
@JvmNameを使う
例
動かなかった例
Convert.kt
fun List<String>.toModel(): List<String> {
return map { "name:"+it }
}
fun List<Int>.toModel(): List<String> {
return { it.toString() }
}
この2つのメソッドが同じものを定義しているというエラーが発生し、ビルドに失敗する
↓のように、@JvmNameというアノテーションを付けると正常に動く
Convert.kt
@JvmName("StringToModel")
fun List<String>.toModel(): List<String> {
return map { "name:"+it }
}
@JvmName("IntToModel")
fun List<Int>.toModel(): List<String> {
return { it.toString() }
}
KotlinはJavaとの互換性を担保しているため、Kotlinでは区別できているメソッドでもJavaから見たら同じメソッドだと認識されてしまうことがある。
(Javaから見ると、拡張メソッドはstaticメソッドで同じファイルに宣言されている)
@JvmNameは、拡張メソッドに名前をつけてあげることができるアノテーション。
設定してあげると、メソッド名の競合を防ぐ事ができる