簡體   English   中英

使用自定義類和Comparator時設置ObservableList的類型

[英]Setting type of ObservableList when using a custom class and Comparator

我正在嘗試對在VBox內擴展HBox的自定義類的列表進行排序。 一切工作都很好,沒有類型聲明,但是我想知道是否有一種方法可以消除警告。

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);
}

嘗試將list設置為ObservableList<FilePane>會出現錯誤,告訴我應將其設置為<Node>因為那是getChildren()返回的內容。 將其設置為<Node>無效,並且FXCollections.sort(list, comp); 給出一個錯誤,指出FilePane將不起作用,因為:

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

FilePane擴展了應該被認為是Node的HBox? 比較器的類型不能設置為Node,因為它需要具有要比較的類。 使用ObservableList<FilePane> list = (ObservableList<FilePane>) fileList.getChildren(); 告訴我它不能做到這一點,所以這不是一個選擇。

我應該忽略類型警告,因為沒有它們就可以正常工作嗎? 有沒有一種方法可以將VBox的子級設置為ObservableList<FilePane>

如果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));

暫無
暫無

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

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