未经检查的ChangeListener警告<! - ? super TableRow - > - 参数

时间:2012-06-20 09:57:24

标签: java generics tableview javafx-2 unchecked-conversion

在JavaFX应用程序中,我将ChangeListener附加到TableCell的{​​{1}} tableRowProperty类型ChangeListener<? super TableRow>TableRow<T>也是通用的)

我做的是以下内容:

public final class PairingResultEditingCell extends TableCell<Pairing, Result> {

    private final ChoiceBox<Result> choiceField;

    // Unchecked casts and raw types are needed to wire the
    // tableRowProperty changed listener
    @SuppressWarnings({ "unchecked", "rawtypes" })
    private PairingResultEditingCell() {

        super();
        this.choiceField = new ChoiceBox<Result>();
        // ReadOnlyObjectProperty<TableRow> javafx.scene.control.TableCell.tableRowProperty()
        this.tableRowProperty()
            // this cast is the actual source of the warnings
            // rawtype of TableRow<T>: ChangeListener<? super TableRow>
            .addListener((ChangeListener<? super TableRow>) new ChangeListener<TableRow<Result>>() {

                @Override
                public void changed(
                        final ObservableValue<? extends TableRow<Result>> observable,
                        final TableRow<Result> oldValue,
                        final TableRow<Result> newValue) {
                    choiceField.setVisible(newValue.getItem() != null);
                }
            });
    }
}

我需要两个抑制两种警告:@SuppressWarnings({ "unchecked", "rawtypes" })。 rawtype警告似乎只是 Eclipse 。但是,Jenkins CI服务器由于前者而拒绝编译代码(我无法更改其配置)。

有没有办法在没有未选中的强制转换和原始类型的情况下执行此操作?我尝试了一个实现接口的内部类,但是我遇到了困难。我也在努力克服Java的? super MyClass语法。

1 个答案:

答案 0 :(得分:1)

我没有收到以下代码的任何警告:

public final class PairingResultEditingCell extends TableCell<Pairing, Result> {

    private final ChoiceBox<Result> choiceField;

    private PairingResultEditingCell() {

        super();
        this.choiceField = new ChoiceBox<Result>();

        ReadOnlyObjectProperty<TableRow> roop= this.tableRowProperty();
        this.tableRowProperty().addListener(new ChangeListener<TableRow>() {
            @Override
            public void changed(ObservableValue<? extends TableRow> observable, TableRow oldValue, TableRow newValue) {
                choiceField.setVisible(newValue.getItem() != null);
            }
        });
    }
}