将ArrayList转换为通用抽象集合

时间:2017-12-13 20:45:45

标签: java generics casting

如何将ArrayList转换为通用集合?我在“SearchListener”中突出显示了“< -----------这不起作用!!!!”的问题

我正在阅读关于Class.cast(o)但我不知道如何在这里应用它。

public abstract class MyTufinCollection<T> extends AbstractCollection<T> implements ListModel<String>{

}

public class SearchListener<T,C extends MyTufinCollection<T>> implements DocumentListener{

private JList jlist;
private C staticCollectionOfTypeT;
private List<Predicate<T>> predicateList = new ArrayList<>();
 //get the String fields, and build Predicate from them.. add to predicateList.



public SearchListener(JList jlist, List<Predicate<T>> predicateList, C collection) {        
    this.jlist = jlist;
    this.staticCollectionOfTypeT=collection;
    this.predicateList=predicateList;
}

@Override
public void insertUpdate(DocumentEvent de) {
    filter();
}

@Override
public void removeUpdate(DocumentEvent de) {
    filter();
}

@Override
public void changedUpdate(DocumentEvent de) {
    filter();
}

private void filter() {
    jlist.setModel((ListModel)staticCollectionOfTypeT);
    C items = (C) jlist.getModel();

    Stream<T> itemStream = items.stream().filter(x ->{
        Stream<Predicate<T>> predicateStream= predicateList.stream();
        return predicateStream.map(predicate -> predicate.test(x)).reduce((a,b)->a && b).get();
    });
    ArrayList<T> collect = itemStream.collect(Collectors.toCollection(ArrayList::new));
    C name = (C)collect; // <-----------This Doesn't work!!!!
    jlist.setModel((ListModel)name);
}

}

1 个答案:

答案 0 :(得分:0)

投射并不意味着将A转换为B 。它只意味着减少视图

因此,如果您有A且此A也是B,例如因为它从中延伸。然后,您可以将视图转换为A,将视图缩小为B。例如,ListCollection延伸,因此您可以将其投射到Collection。但是String不会从Collection延伸,你无法投射它。

在您的情况下,您尝试将ArrayList投射到C,但C extends MyTufinCollection<T>ArrayList并未延伸。这就像尝试将ArrayList转换为HashSet,两者都是Collection,但由于显而易见的原因,它不起作用。

例如MyTufinCollection可能有一些ArrayList没有的东西,Java应该如何自动确定要做什么。它不能,铸造不会起作用。您需要明确提供转换方法。

该术语是is-a原则。您可以在JLS§5.5.1中了解有关投射的更多信息:

  

如果S(来源)是班级类型:

     

如果T(目标)是班级类型,则|S| <: |T||T| <: |S|
  否则,发生编译时错误

     

此外,如果存在X的超级TY的超级S,那么X和{{1}可证明不同参数化类型(§4.5),YX删除相同,发生编译时错误