Java FX:如何在没有匿名内部的情况下重写 RowFactory class - Java 8 兼容

Java FX: How to rewrite a RowFactory without an anonymous inner class - Java 8 Compatible

我目前正在设置我的项目以使用 Java 8。由于限制,这是 Java 当前最高版本,我可以 运行。从我之前的 Java 11 配置转换为 Java 时,我 运行 出现以下问题:

playlistDetailsTable.setRowFactory(tv -> new TableRow<>() {
                                                             ^
  reason: '<>' with anonymous inner classes is not supported in -source 8
    (use -source 9 or higher to enable '<>' with anonymous inner classes)
  where T is a type-variable:
    T extends Object declared in class TableRow

这是失败的当前代码块。如果播放列表已停用,这只会突出显示 table 行。

        playlistDetailsTable.setRowFactory(tv -> new TableRow<>() {
            @Override
            protected void updateItem(Map item, boolean empty) {
                super.updateItem(item, empty);
                ObservableList<String> styles = getStyleClass();
                if (item == null ) {
                    setStyle("");
                } else {
                    final String currentPlaylistRow = (String)item.get(PlaylistBreakdownEnum.PLAYLIST.getColName()) ;
                    final String cleanPlaylistString = currentPlaylistRow.replaceAll("\(.*\)", "").stripTrailing();
                    if (PlaylistEnum.getEnumByPlaylist(cleanPlaylistString).getRetired()) {
                        getStyleClass().add("retired-row");
                    }
                    else {
                        getStyleClass().removeAll("retired-row");
                        }
                }
            }
        });

有谁知道如何有效地解决这个问题?

您的问题不是由使用匿名引起的class。问题是,due to reasons,您不能在 Java 7 或 8 中使用带有匿名 classes 的菱形运算符。该功能直到 Java 9 才添加。由于你正在使用 Java 8 你必须更新你的代码以使通用类型明确。

例如,而不是使用:

playlistDetailsTable.setTableRow(tv -> new TableRow<>() {
    // custom TableRow implementation
});

你必须使用:

playlistDetailsTable.setTableRow(tv -> new TableRow<YOUR_TYPE_HERE>() {
    // custom TableRow implementation
});

YOUR_TYPE_HERE 替换为 TableView 使用的类型。换句话说,如果您的 playlistDetailsTableTableView<Playlist> 那么您将使用 TableRow<Playlist>.