2

コンテナのすべての子のテキストフィールドを取得する必要があります。ウィケットはvisitChildrenと呼ばれるメソッドを提供します

それから私は次のようなことをします:

(FormComponent<?>[]) visitChildren(TextField.class).toList().toArray();

この例は機能しませんが、私が得る例外は次のとおりです。

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lorg.apache.wicket.markup.html.form.FormComponent;

しかし、私が次のようなことをした場合:

List<Component> list = visitChildren(TextField.class).toList();
FormComponent<?>[] array = new FormComponent[list.size()];
for (int x = 0; x < list.size(); x++) {
    array[x] = (FormComponent<?>) list.get(x);
}

それはうまくいきます、なぜそれが起こるのですか?私が見る限り、両方の方法が機能するはずです

4

2 に答える 2

4

最初の(壊れた)例は、次のものと同等です。

List<Component> list = visitChildren(TextField.class).toList();
FormComponent<?>[] array = (FormComponent<?>[]) list.toArray();

のJavadocによるとtoArray()、戻り型はObject[]ですが、にキャストしようとしています(FormComponent<?>[])。これは不正な操作です。

トリッキーな部分は、ここからキャストを実行していないことObjectですFormComponent<?>

むしろ、コードはの配列をの配列にキャストしようとしますObjectFormComponent<?>

これを修正するにtoArrayは、目的の戻り型のオブジェクトを引数として取る代替メソッドを使用してみてください。

FormComponent<?>[] array = list.toArray(new FormComponent<?>[0])

(空の配列を渡すことに注意してくださいFormComponent<?>

于 2013-03-14T02:13:49.840 に答える
0

解決策としてこのコードを試してください:

toArray(new FormComponent<?>[0])
于 2013-03-14T01:54:02.257 に答える