LoginSignup
2
2

More than 5 years have passed since last update.

KotlinでList<Int>とList<String>にextensionをつけたい時につけるアノテーション(@JvmName)

Posted at

概要

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は、拡張メソッドに名前をつけてあげることができるアノテーション。
設定してあげると、メソッド名の競合を防ぐ事ができる

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2