2017-03-05 16 views
1

VBox内でHBoxを拡張するカスタムクラスのリストをソートしようとしています。すべてが型宣言を残して完全に動作していますが、警告を取り除く方法があるかどうか疑問に思っていました。 listObservableList<FilePane>に設定しようとしカスタムクラスとコンパレータを使用する場合のObservableListのタイプの設定

public static class FilePane extends HBox {}  

public void sort() { 
    int order = orderBy.getSelectionModel().getSelectedIndex(); 
    Comparator<FilePane> comp = null; 
    if(order == 0) { 
     comp = Comparator.comparing(FilePane::getFileNameLower); 
    } else if(order == 1) { 
     comp = Comparator.comparingLong(FilePane::getFileDate); 
     comp = comp.reversed(); 
    } else if(order == 2) { 
     comp = Comparator.comparingLong(FilePane::getFileSize); 
     comp = comp.reversed(); 
    } else if(order == 3) { 
     comp = Comparator.comparingLong(FilePane::getFileCount); 
     comp = comp.reversed(); 
    } else if(order == 4) { 
     comp = Comparator.comparing(FilePane::getDirectory); 
     comp = comp.reversed(); 
    } 
    ObservableList list = fileList.getChildren(); 
    FXCollections.sort(list, comp); 
} 

それが何getChildren()戻りますので、それは<Node>に設定する必要が私に告げるエラーが発生します。 <Node>に設定すると、仕事とするのでFXCollections.sort(list, comp);はFilePaneが動作しませんというエラーが発生しますしません:FilePaneはノード考慮しなければならないのHBoxを拡張

The method sort(ObservableList<T>, Comparator<? super T>) in the type FXCollections is not applicable for the arguments (ObservableList<Node>, Comparator<FilePane>) 

?比較するクラスを持つ必要があるため、Comparatorの型をNodeに設定することはできません。 ObservableList<FilePane> list = (ObservableList<FilePane>) fileList.getChildren();でキャスティングすると、それができないので、オプションではないことがわかります。

警告なしで正常に動作するので、タイプ警告を無視する必要がありますか? VBoxの子をObservableList<FilePane>に設定する方法はありますか?

答えて

2

getChildren()Nodeのリストを返す場合、リストはNodeのリストである必要があります。そこから始めて、逆に作業しましょう。

ObservableList<Node> list = fileList.getChildren(); 

いいえ。これがリストであれば、sort()の呼び出しをどのようにコンパイルするのですか?答えは、コンパレータがComparator<Node>で、Comparator<FilePane>ではないことです。

しかし、それは良い、右ですか?そのため、我々はそれらの本当に滑らかなメソッド参照を使用することはできません。FilePane::そこにいて、パートナー。そんなに早くない。そのコードだけを残して、まだsort()を幸せにする方法はありませんか?

あります。 compだけを残しましょう。それはComparator<FilePane>のままです。私たちがしなければならないことは、それをいくつかの方法でComparator<Node>に変換することです。

FXCollections.sort(list, convertSomeHow(comp)); 

どのように変換しますか?さて、sort()はコンパレータNodeを渡す予定です。我々が持っているコンパレータはFilePaneです。だから、私たちがする必要があるのはそこにキャストを入れてからcompに行くことです。このような何か:

FXCollections.sort(list, Comparator.comparing(node -> (FilePane) node, comp)); 

または:

FXCollections.sort(list, Comparator.comparing(FilePane.class::cast, comp)); 
+0

ありがとう!私はラムダを使用して最初の選択肢を使用し、警告がなくなった。 –

関連する問題