java - 将对象数组转换为持有类型 T 的集合的指定子类的方法(生成 JList)

标签 java swing class generics jlist

只是为了学习的乐趣,我不需要替代解决方案(我知道 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)

我知道它的复杂性和特殊性,但我不知道该遵循什么策略,也许是一些黑天鹅行动:)

有什么办法可以实现这一点吗?谢谢!

最佳答案

由于 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
}

第二种选择也“有效”,但不如第一种安全(因为你无法用 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在数组复制期间。

关于java - 将对象数组转换为持有类型 T 的集合的指定子类的方法(生成 JList),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11081031/

相关文章:

java - Jersey 2 中调用代理对象的包私有(private)方法的奇怪行为

java - 为什么 DocumentFilter 没有给出预期的结果?

java - BasicPopupMenuUI 错误

c# - java C# vb : how do we dynamically create an instance of a class from a string input (class name)

java - Java 中的多客户端套接字?

java - 我在 JEE 套接字项目 SLF4J : Failed to load class "org.slf4j.impl.StaticLoggerBinder" 中遇到错误

java - 没有得到预期的输出

java - 按需填充下拉菜单 Java/Swing?

c++ vector::erase with class object iterator 不删除 vector 成员

javascript - 阅读类(class)并使用 javascript 或 jquery 应用 css