2017-12-13 3 views
0

ArrayListを汎用コレクションにキャストするにはどうすればよいですか?私は "SearchListener"の問題を "<"と強調表示しています-----------これは動作しません!!!! "ArrayListを汎用抽象コレクションにキャストする

私は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

なぜそれはうまくいくと思いますか? –

+1

どうすればこの作品を作れますか?新しいMyTufinCollection()コンビニエンスクラスを作成し、Collectors.toCollection(new MyTufinCollection(){...})を使用しますか?それとも良い方法がありますか? –

答えて

0

キャスティングはBに変換Aを意味するものではありません。ビューを縮小することだけがを意味します。

したがって、Aがある場合、このAは、たとえばBであるため、このようになります。次に、にキャストして、これをAに縮小することができます。たとえば、ListCollectionから拡張されており、Collectionにキャストできます。しかし、StringCollectionから拡張されません。キャストすることはできません。

ArrayListCにキャストしようとしましたが、C extends MyTufinCollection<T>です。 ArrayListはこれから拡張されていません。 ArrayListHashSetにキャストしようとするのと同じですが、どちらもCollectionですが、それは明らかな理由から機能しません。

たとえば、MyTufinCollectionは、ArrayListにはないものがあります。どのようにJavaが自動的に処理するかを決定する必要があります。それはできません、鋳造は動作しません。あなたはを明示的に変換方法を与える必要があります。

用語はis-aの原則です。あなたはJLS§5.5.1でのキャスト詳細を読むことができます:

S(ソース)がクラス型の場合:T(ターゲット)|S| <: |T|、または|T| <: |S|のいずれか、その後、クラス型である場合


の場合、コンパイル時エラーが発生します。 XY両方が証明可能異なるパラメータ化された型(§4.5)であるように、及び消去XYであることがさらに

TのスーパーX、及びSのスーパーYが存在する場合、 と同じコンパイル時エラーが発生します。

+0

はい、一般的なので新しいCを作成することはできません。どのようにこれを克服しますか? –

+0

なぜ 'C 'の新しいインスタンスを作成できないのですか?最低でも 'MyTufinCollection 'なので、そのクラスが提供するすべてのメソッドを使うことができます。私はあなたが 'ArrayList'が' MyTufinCollection'になる方法を自分自身に尋ねる必要があることを意味します。 'MyTufinCollection'はある種の' add'メソッドを提供していますか?次に、 'ArrayList'の要素を単純に追加することができます。 – Zabuza

関連する問題