当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《JavaFX中的ChangeListener:如何使这些泛型参数不那么难看?》经验,为你挑选了1个好方法。

关于泛型,我被告知铸造是坏的,并且通常有一些方法可以完全消除铸造,因为编译器在检查程序时能够做到最好.在这里将ChangeListener添加到ReadOnlyDoubleProperty似乎打败了这个理想.这是API中的缺陷,还是规则的例外,还是实际上有一些方法可以使这段代码看起来很好?

nodeA.heightProperty().addListener(new ChangeListener() {
    @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 ob = ( ObservableValue< Double > ) observable;
        // do stuff
    }
});

首先,我可以在ChangeListener上使用的最具体的类型参数是Number.我应该可以使用Double!这是DoubleExpression!由于这个问题,我必须解压缩changed方法的参数.请帮助减少这里的行数.Lambdas可以减少行数,但我会特别询问泛型.



1> James_D..:

tl; dr:使用asObject.

首先请注意,在您发布的示例中,根本没有理由引用该observable参数,因为它必须与之相同nodeA.heightProperty().因此,您可以简单地消除向下转发

nodeA.heightProperty().addListener(new ChangeListener() {
    @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() ...
    }
});

这并不奇怪:实际上我认为我不需要引用传递给此方法的observable,因为我总是使用相同的模式.

至于ReadOnlyDoubleProperty实现ObservableValue,实际上ObservableValue,这是一个便利功能,或设计缺陷,取决于你的观点.(参见此处和其他地方的讨论......).解决方法是调用asObject()ReadOnlyDoubleProperty,它返回一个ReadOnlyObjectProperty是双向绑定ReadOnlyDoubleProperty,并实现ObservableValue:

nodeA.heightProperty().asObject().addListener(new ChangeListener() {
    @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在上述冗余).

你当然可以用lambdas做得更好:

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

    // do stuff..
});

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有