[英]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
例如, List
從Collection
擴展而來,因此您可以將其強制轉換為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
的超類型X
和S
的超類型Y
,從而X
和Y
都是可證明是不同的參數化類型(第4.5節 ),並且X
和Y
的擦除 相同 ,則編譯時發生錯誤 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.