Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于将对象数组转换为集合保持类型T(generifies JList)的指定子类的方法_Java_Swing_Class_Generics_Jlist - Fatal编程技术网

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

Java 用于将对象数组转换为集合保持类型T(generifies JList)的指定子类的方法,java,swing,class,generics,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

只是为了学习的乐趣,我不需要其他解决方案(我知道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;
    }
private U jListSelected2Coll(JList列表,类类型{
Collection coll=XX;//获取类型为的实例
Object[]数组=list.getSelectedValues();
Collections.addAll(coll,array.copyOf(array,array.length,type.subtype_在_T.class中));
返回coll;
}
这将被称为类似

     TreeSet<String> selectedItems = jListSelected2Coll(list,TreeSet<String>.class)
TreeSet selectedItems=jListSelected2Coll(列表,TreeSet.class)
我知道它的复杂性和特殊性,但我不知道该采取什么策略,也许是一些黑天鹅行动:)


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

由于Java类型的擦除,您试图实现的目标无法直接在Java中完成。然而,有一些技巧可以让你得到你想要的东西

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

public static U jListSelected2Coll(
JList,U coll,类类型2)抛出实例化异常,
非法访问例外{
Object[]数组=list.getSelectedValues();
T[]dest=(T[])Array.newInstance(type2,Array.length);
System.arraycopy(数组,0,dest,0,数组.长度);
集合。添加所有(coll,dest);
返回coll;
}
public static void test()抛出实例化异常,IllegalAccessException{
JList list=新JList();
TreeSet TreeSet=jListSelected2Coll(列表,newtreeset(),String.class);
//用这棵树做点什么
}
第二种方法也“有效”,但不如第一种方法安全(因为不能用Java表达
Class
):

public static U jListSelected2Coll(
JList、Class collType、Class type2)抛出实例化异常,
非法访问例外{
U coll=collType.newInstance();
Object[]数组=list.getSelectedValues();
T[]dest=(T[])Array.newInstance(type2,Array.length);
System.arraycopy(数组,0,dest,0,数组.长度);
集合。添加所有(coll,dest);
返回coll;
}
public static void test()抛出实例化异常,IllegalAccessException{
JList list=新JList();
TreeSet TreeSet=jListSelected2Coll(列表,TreeSet.class,String.class);
//用这棵树做点什么
}

在这两种情况下,如果JList的选定值的类型不正确,您将在arraycopy期间获得一个
java.lang.ArrayStoreException

由于java类型擦除,您试图实现的操作无法直接在java中完成。然而,有一些技巧可以让你得到你想要的东西

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

public static U jListSelected2Coll(
JList,U coll,类类型2)抛出实例化异常,
非法访问例外{
Object[]数组=list.getSelectedValues();
T[]dest=(T[])Array.newInstance(type2,Array.length);
System.arraycopy(数组,0,dest,0,数组.长度);
集合。添加所有(coll,dest);
返回coll;
}
public static void test()抛出实例化异常,IllegalAccessException{
JList list=新JList();
TreeSet TreeSet=jListSelected2Coll(列表,newtreeset(),String.class);
//用这棵树做点什么
}
第二种方法也“有效”,但不如第一种方法安全(因为不能用Java表达
Class
):

public static U jListSelected2Coll(
JList、Class collType、Class type2)抛出实例化异常,
非法访问例外{
U coll=collType.newInstance();
Object[]数组=list.getSelectedValues();
T[]dest=(T[])Array.newInstance(type2,Array.length);
System.arraycopy(数组,0,dest,0,数组.长度);
集合。添加所有(coll,dest);
返回coll;
}
public static void test()抛出实例化异常,IllegalAccessException{
JList list=新JList();
TreeSet TreeSet=jListSelected2Coll(列表,TreeSet.class,String.class);
//用这棵树做点什么
}
在这两种情况下,如果JList的选定值的类型不正确,您将在arraycopy期间获得一个
java.lang.ArrayStoreException

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

@SuppressWarnings("unchecked")
public static <T> void addJListSelected2Coll(JList list, Collection<T> coll) {
    for (Object x : list.getSelectedValues())
        coll.add((T)x); // unchecked cast
}
@SuppressWarnings(“未选中”)
公共静态无效addJListSelected2Coll(JList列表,coll集合){
对于(对象x:list.getSelectedValues())
coll.add((T)x);//未选中的强制转换
}
不安全(它信任您,并且不检查您从JList获得的元素是否为正确类型),但无需传入

@SuppressWarnings("unchecked")
public static <T> void addJListSelected2Coll(JList list, Collection<T> coll) {
    for (Object x : list.getSelectedValues())
        coll.add((T)x); // unchecked cast
}
@SuppressWarnings(“未选中”)
公共静态无效addJListSelected2Coll(JList列表,coll集合){
对于(对象x:list.getSelectedValues())
coll.add((T)x);//未选中的强制转换
}
@SuppressWarnings("unchecked")
public static <T> void addJListSelected2Coll(JList list, Collection<T> coll) {
    for (Object x : list.getSelectedValues())
        coll.add((T)x); // unchecked cast
}