私はこの部分で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!
問題の原因を確認できません。
これは、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
でプロパティを使用できます。
すでに与えられた答えに加えて...
val
(またはvar
)を保持しながら、パラメーターの名前をスーパークラス宣言と衝突しない名前に変更できます。多くの場合、クラス宣言では、コンストラクター宣言のパラメーターは単なるパラメーターではありません。 val
またはvar
を使用すると、実際にはプロパティメンバー(パラメーターだけでなく)を宣言します。そして、プロパティメンバーと共に、自動「ゲッター」(およびvar
の場合は「セッター」)が付属します。 OPの場合、自動ゲッターはgetContext()
butと呼ばれます。基本クラスにはすでにgetContext()(同じシグネチャ)があります。
ほとんどの場合、ここでの意図はcontext
をスーパーに渡すことだけでした。その場合、他の答えが最適です。ただし、新しいプロパティが必要であるが、選択した名前がスーパーの別の目的のメンバーと衝突する場合、名前を変更することが代替手段です。
略して、名前の変更は、do新しいメンバー変数が必要な場合に適用されますbutスーパークラスはすでに同じ名前の異なるメンバーを公開しています。