3

kotlin 拡張機能を Java オブジェクトのように設定できるかどうかはわかりません。

私のプログラムでは、呼び出されたJavaクラスがSubmissionあり、その呼び出されたkotlin拡張機能(ArrayList)を作成したかったcategoriesので、このように作成しました。

var Submission.categories: ArrayList<String>
    get() {
        return this.categories
    }
    set(categories){
        this.categories = categories
    }

ただし、カテゴリを設定しようとするたびに、プログラムは次のような stackOverflowError でクラッシュします。

ERR: stack=java.lang.StackOverflowError: stack size 8MB
             at com.....setCategories(Extensions.kt:0)
             at com.....setCategories(Extensions.kt:19)
             at com.....setCategories(Extensions.kt:19)
             at com.....setCategories(Extensions.kt:19)
             at com.....setCategories(Extensions.kt:19)
             at com.....setCategories(Extensions.kt:19)

これは、kotlin 拡張機能を宣言するための正しい構文のようです。したがって、これを修正するためにどの方向に進むべきか本当にわかりません。おそらく、単純な古い継承を使用する必要がありますか?

ありがとう。

4

1 に答える 1

4

あなたのコードは、StackOverflowErrorそれ自体を再帰的に呼び出すため、 a をスローします。this.categoriesすでに入っているゲッターをthis.categories = categories呼び出し、すでに入っているセッターを呼び出すだけです。

拡張プロパティは、1 組の (拡張) ゲッターとセッターのシンタックス シュガーにすぎません。プロパティ アクセサー (つまり、ゲッターとセッター) 内ではpublic、レシーバー クラスから既にアクセス可能なものにのみアクセスできます。パブリック フィールドがある場合、それらにアクセスできますが、新しいフィールドを定義することはできません。追加の状態を保存したいが、クラスにそのための API がない場合は、うまくいきません。

変更可能な拡張プロパティが通常行うことは、既存の変更関数へのリダイレクトです。これが例です。

//java
class Foo {
    private List<String> items;

    public String myItems() {
        return items;
    }
}


//kotlin
var Foo.firstItem: String
    get() = myItems()[0]
    set(value) {
        myItems()[0] = value
    }
于 2016-12-19T13:46:18.977 に答える