Java型消去のため、達成しようとしていることをJavaで直接実行することはできません。ただし、期待どおりの結果を得るには、いくつかのトリックがあります。
ここに2つの解決策があります(多かれ少なかれ受け入れられます):
public static <U extends Collection<T>, T> U jListSelected2Coll(
JList list, U coll, Class<T> type2) throws InstantiationException,
IllegalAccessException {
Object[] array = list.getSelectedValues();
T[] dest = (T[]) Array.newInstance(type2, array.length);
System.arraycopy(array, 0, dest, 0, array.length);
Collections.addAll(coll, dest);
return coll;
}
public static void test() throws InstantiationException, IllegalAccessException {
JList list = new JList();
TreeSet<String> treeSet = jListSelected2Coll(list, new TreeSet<String>(), String.class);
// do something with the treeSet
}
2番目の選択肢も「機能」しますが、最初の選択肢ほど安全ではありません(Javaで表現できないためClass<U extends Collection<T>>
)。
public static <U extends Collection<T>, T> U jListSelected2Coll(
JList list, Class<U> collType, Class<T> type2) throws InstantiationException,
IllegalAccessException {
U coll = collType.newInstance();
Object[] array = list.getSelectedValues();
T[] dest = (T[]) Array.newInstance(type2, array.length);
System.arraycopy(array, 0, dest, 0, array.length);
Collections.addAll(coll, dest);
return coll;
}
public static void test() throws InstantiationException, IllegalAccessException {
JList list = new JList();
TreeSet<String> treeSet = jListSelected2Coll(list, TreeSet.class, String.class);
// do something with the treeSet
}
どちらの場合も、JListの選択された値が正しいタイプでない場合はjava.lang.ArrayStoreException
、アレイコピー中にを取得します。