web-dev-qa-db-ja.com

偶発的なオーバーライド:次の宣言には同じJVMシグネチャがあります

私はこの部分でKotlinでこのエラーを受け取っています:

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

プライベートvalコンテキスト:コンテキスト

ログには次のように書かれています:

エラー:(14、25)偶発的なオーバーライド:次の宣言には同じJVMシグネチャ(getContext()Landroid/content/Context;)があります:fun():Context fun getContext():Context!

問題の原因を確認できません。

39

これは、Kotlinコンパイラーがクラスプライマリコンストラクターで宣言された_val context_のゲッター、つまりメソッドgetContext()を生成しようとしますが、ベースクラス _ArrayAdapter<T>_は既にそのようなメソッド

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

  • クラスのコンストラクタパラメータをvalにならないように変更します。

    _ class GitHubRepoAdapter(context: Context, ...
    _

    この場合、ゲッターは生成されず、競合は解消されます。

    再宣言をしなくても、 Java getter から推論された合成プロパティcontextが既に存在するため、これはあなたの場合の望ましい解決策のようです。

  • _@JvmName_ アノテーションを使用し、 contextプロパティゲッターに適用

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

    これにより、コンパイラーは別のJVM名(注釈で指定された名前)でゲッターを生成し、競合を回避しますが、Java同様の機能).Kotlinでは、元の名前contextでプロパティを使用できます。

56
hotkey

すでに与えられた答えに加えて...

  • または、val(またはvar)を保持しながら、パラメーターの名前をスーパークラス宣言と衝突しない名前に変更できます。

多くの場合、クラス宣言では、コンストラクター宣言のパラメーターは単なるパラメーターではありません。 valまたはvarを使用すると、実際にはプロパティメンバー(パラメーターだけでなく)を宣言します。そして、プロパティメンバーと共に、自動「ゲッター」(およびvarの場合は「セッター」)が付属します。 OPの場合、自動ゲッターはgetContext()butと呼ばれます。基本クラスにはすでにgetContext()(同じシグネチャ)があります。

ほとんどの場合、ここでの意図はcontextをスーパーに渡すことだけでした。その場合、他の答えが最適です。ただし、新しいプロパティが必要であるが、選択した名前がスーパーの別の目的のメンバーと衝突する場合、名前を変更することが代替手段です。

略して、名前の変更は、do新しいメンバー変数が必要な場合に適用されますbutスーパークラスはすでに同じ名前の異なるメンバーを公開しています。

20
Les