web-dev-qa-db-ja.com

Kotlinプロパティアクセス構文は、Javaクラス(EditText setText)に対してどのように機能しますか?

私はAndroidプロジェクトをKotlinに切り替えようとしています。ヒントを設定したいEditTextTextViewのサブクラス)がありますテキストはプログラムで作成します。ヒントは期待どおりに動作しますが、テキストの場合、Kotlin setter構文を使用してそれを行おうとすると、型の不一致の例外が発生します。

_    val test = EditText(context)

    test.setHint("hint")    // Lint message: "Use property access syntax"
    test.hint = "hint"      // ok

    test.setText("text")    // ok (no lint message)
    test.text = "text"      // Type mismatch: inferred type is kotlin.String but Android.text.Editable! was expected
_

宣言を見ると、TextViewから継承された同一の署名が見つかります。

_    public final void setHint(CharSequence hint)

    public final void setText(CharSequence text)
_

_x.y = z_はx.setY(z)のショートカットであるという印象がありましたが、明らかにその印象は間違っていました。 setText()はセッターではなく通常のメソッドとして扱われますが、コンパイラーの動作を変えるこれら2つのメソッドの違いは何ですか?私が考えることができる唯一のものは、TextViewmHintプロパティを持っているということですが、そうではないかもしれません。

私がよく理解していないもう1つのことは、_Android.text.Editable_はどこから来たのですか?対応するsetText(Editable)メソッドはなく、このタイプのパブリックフィールドもありません。

23
SqueezyMo

Javaゲッター/セッターペアの合成プロパティを生成する場合、Kotlinは最初にゲッターを探します。ゲッターはゲッターのタイプで合成プロパティを作成するのに十分です。一方、プロパティセッターのみが存在する場合は作成されません。

セッターがプレイに入ると、プロパティの作成がより難しくなります。その理由は、ゲッターとセッターのタイプが異なる可能性があるためです。さらに、サブクラスでゲッターおよび/またはセッターをオーバーライドできます。

あなたの場合、TextViewクラスにはゲッターCharSequence getText()とセッターvoid setText(CharSequence)が含まれています。タイプTextViewの変数がある場合、コードは正常に機能します。しかし、EditText型の変数があります。また、EditTextクラスにはオーバーライドされたゲッターEditable getText()が含まれています。つまり、EditableEditTextを取得し、EditableEditTextに設定できます。したがって、Kotlinはタイプtextの合成プロパティEditableを合理的に作成します。 StringクラスはEditableではありません。そのため、StringインスタンスをtextクラスのEditTextプロパティに割り当てることはできません。

46
Michael

型の不一致を避けるために、EditableクラスのFactory内部クラスを使用できます。そのため、次のようなことができます。

textview.text = Editable.Factory.getInstance().newEditable("your text")  
11

または、拡張機能を作成することもできます。

fun String.toEditable(): Editable =  Editable.Factory.getInstance().newEditable(this)

その後、次のように使用できます。

mEditText.text = myString.toEditable()
6
BNY

_Android.text.Editable_は getText() に由来します。 Kotlinの_obj.text = value_解決は2ステッププロセスであるように思われます。

  1. コンパイラは、textプロパティまたはJava method getTextからプロパティタイプを推測しようとする
  2. 推論されたプロパティタイプの場合、コンパイラは対応するプロパティセッターまたはJava method setText(PropertyType value)

1.では、推定される型はEditableであるため、_editText.text = "value"_は_Type mismatch_エラーで失敗します。

4
miensol