2016-05-22 8 views
16

私はAndroidプロジェクトをKotlinに切り替えようとしています。私はEditTextTextViewのサブクラス)を持っており、ヒントとテキストをプログラムで設定したいと思っています。ヒントは期待どおりに機能します。私はKotlinセッターの構文を使用してそれを実行しようとした場合、テキストの場合は、しかし、私は、型の不一致の例外を取得しています:KotlinプロパティがJavaクラス(EditText setText)の構文にどのようにアクセスするのですか?

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 = zx.setY(z)のショートカットですが、明らかにその印象は間違っていたようです。 setText()は、セッターではなく通常のメソッドとして扱われますが、コンパイラの動作が異なるようにするこれら2つのメソッドの違いは何ですか?私が考えることができるのは、TextViewmHintというプロパティがありますが、私はそれが当てはまるとは思わないのです。

もう一つ分かりませんが、android.text.Editableはどこから来たのですか?対応するsetText(Editable)メソッドが存在せず、このタイプのパブリックフィールドもありません。

ありがとうございました。

答えて

22

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

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

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

+0

いい説明、 – azizbekian

3

android.text.EditablegetText()です。 Kotlinのobj.text = value解像度は2ステッププロセスであると私には分かります。コンパイラがコンパイラは、対応するプロパティセッターまたはJavaメソッドsetText(PropertyType value)

を見つけようと推測されプロパティタイプのプロパティタイプ

  • を推定そこからtextプロパティまたはJavaメソッドgetTextを発見しようと

    1. 1では推測タイプがEditableであるため、editText.text = "value"Type mismatchエラーで失敗します。

  • 2

    タイプの不一致を避けるには、EditableクラスのFactory内部クラスを使用できます。 これで、次のようなことができます:

    textview.text = Editable.Factory.getInstance().newEditable("your text") 
    
    関連する問題