JavaFX中的ChangeListener:如何使这些泛型参数不那么难看?

JavaFX中的ChangeListener:如何使这些泛型参数不那么难看?,java,generics,javafx,Java,Generics,Javafx,关于泛型,我被告知强制转换是不好的,通常有一些方法可以完全消除强制转换,以便编译器在检查我的程序时能发挥最佳效果。在a中添加a似乎会挫败这一理想。这是API中的一个缺陷,还是规则的一个例外,或者实际上有什么方法可以让代码看起来很好 nodeA.heightProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue< ? ex

关于泛型,我被告知强制转换是不好的,通常有一些方法可以完全消除强制转换,以便编译器在检查我的程序时能发挥最佳效果。在a中添加a似乎会挫败这一理想。这是API中的一个缺陷,还是规则的一个例外,或者实际上有什么方法可以让代码看起来很好

nodeA.heightProperty().addListener(new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue< ? extends Number > observable,
                        Number oldValue,
                        Number newValue ) {
        final double ov = oldValue.doubleValue();
        final double nv = newValue.doubleValue();
        @SuppressWarnings("unchecked")
        final ObservableValue<Double> ob = ( ObservableValue< Double > ) observable;
        // do stuff
    }
});
首先,我可以在ChangeListener上使用的最具体的类型参数是。我应该可以用双人!这是一个好主意!由于这个问题,我必须将参数解压缩到已更改的方法。请帮我减少这里的行数。Lambdas可以减少行数,但我要问的是泛型;医生:使用

首先请注意,在您发布的示例中,根本没有理由引用observable参数,因为它必须与nodeA.heightProperty相同。因此,您可以简单地使用

nodeA.heightProperty().addListener(new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue< ? extends Number > observable,
                        Number oldValue,
                        Number newValue ) {
        final double ov = oldValue.doubleValue();
        final double nv = newValue.doubleValue();

        // do stuff with nodeA.heightProperty() ...
    }
});
拆箱还使ov和nv在上述情况下成为冗余

当然,你可以用lambdas让它变得更好:

nodeA.heightProperty().asObject().addListener((obs, oldValue, newValue) -> {
    // obs is now an ObservableValue<Double>, if you need it
    // oldValue is a Double, which can be treated as a double via unboxing
    // similarly newValue is a Double

    // do stuff..
});
tl;医生:使用

首先请注意,在您发布的示例中,根本没有理由引用observable参数,因为它必须与nodeA.heightProperty相同。因此,您可以简单地使用

nodeA.heightProperty().addListener(new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue< ? extends Number > observable,
                        Number oldValue,
                        Number newValue ) {
        final double ov = oldValue.doubleValue();
        final double nv = newValue.doubleValue();

        // do stuff with nodeA.heightProperty() ...
    }
});
拆箱还使ov和nv在上述情况下成为冗余

当然,你可以用lambdas让它变得更好:

nodeA.heightProperty().asObject().addListener((obs, oldValue, newValue) -> {
    // obs is now an ObservableValue<Double>, if you need it
    // oldValue is a Double, which can be treated as a double via unboxing
    // similarly newValue is a Double

    // do stuff..
});

可能重复的可能重复的感谢!我错过了一个目标。提醒您始终检查我正在查看的文档的版本。我要反驳你的断言,即没有理由引用可观测参数。在显示的代码中,是的,您是对的。更一般地说,侦听器并不总是在同一范围内。无论如何,谢谢你的回答。谢谢!我错过了一个目标。提醒您始终检查我正在查看的文档的版本。我要反驳你的断言,即没有理由引用可观测参数。在显示的代码中,是的,您是对的。更一般地说,侦听器并不总是在同一范围内。无论如何,谢谢你的回答。