gpt4 book ai didi

java - JavaFX 中的 ChangeListener : how can I make these generics parameters less ugly?

转载 作者:行者123 更新时间:2023-11-29 07:36:45 24 4
gpt4 key购买 nike

关于泛型,有人告诉我强制转换是不好的,通常有一些方法可以完全消除强制转换,以便编译器在检查我的程序时发挥最佳作用。添加 ChangeListener这里是ReadOnlyDoubleProperty似乎打败了这个理想。这是 API 中的缺陷,还是规则的异常(exception),或者实际上是否有某种方法可以使此代码看起来不错?

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 上使用的最具体的类型参数是 Number .我应该可以使用 Double!这是一个DoubleExpression !由于这个问题,我必须解压缩 changed 方法的参数。请帮助减少此处的行数。 Lambda 可以减少行数,但我要特别询问泛型。

最佳答案

tl;dr: 使用 asObject .

首先请注意,在您发布的示例中,根本没有理由引用 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() ...
}
});

这一点也不奇怪:事实上,我认为我从来没有需要引用传递给这个方法的可观察对象,因为我总是使用相同的模式。

至于ReadOnlyDoubleProperty工具 ObservableValue<Number> , 因为不是 ObservableValue<Double> ,这要么是便利功能,要么是设计缺陷,具体取决于您的观点。 (参见讨论 here 和其他地方...)。解决方法是调用 asObject()ReadOnlyDoubleProperty 上,它返回一个 ReadOnlyObjectProperty<Double>双向绑定(bind)到 ReadOnlyDoubleProperty ,并实现 ObservableValue<Double> :

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

// do stuff
}
});

(拆箱也会使上面的 ovnv 变得多余。)

当然,您可以使用 lambda 使它变得更好:

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

关于java - JavaFX 中的 ChangeListener : how can I make these generics parameters less ugly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34733972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com