1. ホーム
  2. kotlin

[解決済み] オーバーライドの事故 次の宣言は、同じ JVM シグネチャを持ちます。

2023-08-22 04:08:50

質問

Kotlinでこの部分がエラーになります。

class GitHubRepoAdapter(
    private val context: Context,
    private val values: List<GithubRepo>
) : ArrayAdapter<GithubRepo>(
    context, 
    R.layout.list_item,
    values
)

private val context: Context

ログにはこう書かれています。

Error:(14, 25) Accidental override: The following declarations have the same JVM signature
(getContext()Landroid/content/Context;):  
    fun <get-context>(): Context  
    fun getContext(): Context!

何が原因なのかがわかりません。

どのように解決するのですか?

この現象は、Kotlinコンパイラが val context のゲッター、すなわちクラスの一次コンストラクタで宣言されたメソッド getContext() が、ベースクラス ArrayAdapter<T> にはすでにそのようなメソッド .

以下のいずれかを実行することで解決できます。

  • クラスのコンストラクタのパラメータが val .

       class GitHubRepoAdapter(context: Context, ...
    
    

    この場合、ゲッターは生成されないので、衝突はなくなります。

    これはあなたの場合、望ましい解決策だと思われます。なぜなら、再宣言なしでも にはすでに合成プロパティ context から推論され、Java のゲッター .

  • を使用します。 @JvmName アノテーションを使用します。 に適用します。 context プロパティゲッター :

       class GitHubRepoAdapter(@get:JvmName("getAdapterContext") private val context: Context, ...
    
    

    これにより、コンパイラは別のJVM名(アノテーションで指定されたもの)でゲッターを生成し、競合を回避しますが、Javaからのアクセスは直感的ではなくなります(特に、2つの類似した関数があるため)。Kotlinでは、元の名前でプロパティを使用することができます。 context .