アレイが改訂されました。つまり、コンポーネントタイプへの参照を保持し、要素を挿入するときには、その参照を使用して、挿入された要素が実際にコンポーネントタイプのサブタイプであるかどうかを確認します。このため
は、T[]
を作成するには、コンポーネントタイプT
への具体的な言及を必要とし、ジェネリック医薬品が消去されているので、ジェネリックT
はカウントされません。 (それはあなたがまっすぐにT[]
T[] arr = new T[]
などを作成することができない理由でもあります。)
コレクションのtoArray
方法は、ユーザーがコンポーネント型の配列を渡すことによってこの問題を回避取得します。しかし、を試すこれはあなたのObject[]
をT[]
にキャストして実際にT
の配列を作成しないでください(T
の由来は?)。このようなキャストは、T
が実際にObject
でない限り、チェックされていないと失敗します。
また、ClassCastException
が由来しています。 Object[]
を作成すると、T[]
にキャストしてもコンポーネントタイプはObject
であり、コンポーネントタイプはObject
のままです。
public clTag[] getSelectedTags() {
return (clTag[]) txtTags.getItems();
}
しかし、あなたがObject[]
をキャストすることはできません。
public clTag[] getSelectedTags() {
return txtTags.getItems();
}
だからコンパイラはclTag[]
に、ここでの暗黙的なキャストを挿入します。しかし後に、あなたがしたい、実際のコンポーネントタイプ(clTag
を)知っていますclTag[]
と同じようにObject
をclTag
にキャストできないようです。
あなたの問題を回避するには、あなたが実際にコンポーネント型への参照を供給しているので、動作します、コンポーネント型の配列を渡すよりも、より近代的な解決策はIntFuntion<T[]>
を渡すことです
Arrays.asList(txtTags.getItems()).toArray(new clTag[0]) // <-- 'clTag' here
メソッドに、配列コンストラクタをカプセル化:...
public T[] getItems(IntFunction<T[]> arrCons) {
...
T[] arrItems = currentItems.toArray(arrCons.apply(0));
return arrItems;
}
txtTags.getItems(clTag[]::new);
しかし、List<T>
(GhostCatも示唆したとおり)を返すように切り替えない限り、何らかの方法でコンポーネントタイプを渡す必要はありません。ジェネリック医薬品はが具体化されていないので、あなたがコンポーネントタイプを参照することなくList<T>
を作成することができますコンパイルした後
public List<T> getItems() {
...
return new ArrayList<>(currentItems);
}
スタックトレースを投稿してください。 – Turing85
すべての良い3つのアプローチ。配列の代わりにListを返す方がはるかに簡単なので、まず設計に戻り、リストの代わりに配列を返すようにこのクラスを設計した理由を見てみましょう。ありがとう。 – lvr123