簡體   English   中英

將ArrayList強制轉換為通用抽象集合

[英]Cast ArrayList to a Generic Abstract Collection

如何將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);
}

}

強制轉換並不意味着將A轉換為B。 這僅意味着縮小視圖

因此,如果您有一個A並且該A也是一個B ,例如,因為它是從A擴展過來的。 然后,可以通過將視圖強制轉換為B來縮小視圖A 例如, ListCollection擴展而來,因此您可以將其強制轉換為Collection 但是String不能從Collection擴展,您不能轉換它。

在您的情況下,您嘗試將ArrayList C extends MyTufinCollection<T>轉換為C ,但是C extends MyTufinCollection<T> ArrayList不從此擴展。 就像試圖將ArrayList轉換為HashSet ,它們都是Collection但是由於明顯的原因而無法正常工作。

例如MyTufinCollection有一些ArrayList沒有的東西,Java應該如何自動確定要做什么。 不能,強制轉換將不起作用。 您將需要明確給出一種轉換方法。

該術語是is-a原理。 您可以在JLS§5.5.1中閱讀有關鑄造的更多信息:

如果S (源)是類類型:

如果T (目標)是類類型,則|S| <: |T| |S| <: |T| ,或|T| <: |S| |T| <: |S|
否則 ,將發生編譯時錯誤

此外,如果存在T的超類型XS的超類型Y ,從而XY都是可證明是不同的參數化類型(第4.5節 ),並且XY擦除 相同 ,則編譯時發生錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM