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

不安全(它信任您,并且不检查您从 JList 获得的元素是正确的类型),但不需要传入 a 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 回答
2

由于 Java 类型擦除,您试图实现的目标不能直接在 Java 中完成。但是,有一些技巧几乎可以达到您的期望。

以下是两种解决方案(或多或少可以接受):

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
}

第二种选择也“有效”,但不如第一种安全(因为你不能Class<U extends Collection<T>>用 Java 表达):

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在 arraycopy 期间得到一个。

于 2012-06-18T12:08:51.670 回答