0

学習を楽しむためだけに、別の解決策は必要ありません(JListはJava7で汎用的であることがわかっています)。ありがとうございます。私が探しているのはこのようなものでしょう...

    private <U,T> U<T> jListSelected2Coll(JList list, Class<U extends Collection<T>> type{
         Collection<T> coll = XX;//Getting an instance of type 
         Object[] array = list.getSelectedValues();
         Collections.addAll(coll, Arrays.copyOf(array, array.length, type.subtype_inside_the_T.class));
         return coll;
    }

これは次のようなものと呼ばれます

     TreeSet<String> selectedItems = jListSelected2Coll(list,TreeSet<String>.class)

私はその複雑で特別なことを知っていますが、どの戦略に従うべきかわかりません、多分いくつかの黒い白鳥の行動:)

それを達成する方法はありますか?ありがとう!

4

2 に答える 2

2

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、アレイコピー中にを取得します。

于 2012-06-18T12:08:51.670 に答える
2

安全ではありません(JListから取得した要素が正しいタイプであることを信頼し、チェックしません)が、Class:を渡す必要はありません。

@SuppressWarnings("unchecked")
public static <T> void addJListSelected2Coll(JList list, Collection<T> coll) {
    for (Object x : list.getSelectedValues())
        coll.add((T)x); // unchecked cast
}
于 2012-06-18T17:58:43.827 に答える