首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于将对象数组转换为集合保持类型T的指定子类的方法(泛化JList)

用于将对象数组转换为集合保持类型T的指定子类的方法(泛化JList)
EN

Stack Overflow用户
提问于 2012-06-18 18:31:46
回答 2查看 161关注 0票数 0

只是为了学习的乐趣,我不需要替代的解决方案(我知道JList在Java7中是通用的),谢谢!我要看的东西是这样的.

代码语言:javascript
复制
    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;
    }

这将被称为类似于

代码语言:javascript
复制
     TreeSet<String> selectedItems = jListSelected2Coll(list,TreeSet<String>.class)

我知道这很复杂和特殊,但我不知道该采取什么策略,也许是一些黑天鹅的行动:)

有什么办法可以做到这一点吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-18 20:08:52

由于Java类型擦除,您尝试实现的目标不能直接在Java中完成。然而,有一些技巧可以很好地得到你所期望的。

这里有两个解决方案(或多或少可以接受):

代码语言:javascript
复制
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
}

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

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2012-06-19 01:58:44

不安全(它信任您,但不检查您从JList获得的元素是否为正确类型),但不需要传入Class

代码语言:javascript
复制
@SuppressWarnings("unchecked")
public static <T> void addJListSelected2Coll(JList list, Collection<T> coll) {
    for (Object x : list.getSelectedValues())
        coll.add((T)x); // unchecked cast
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11081031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档