java - JavaFX SimpleDoubleProperty.addListener 方法是否声明错误?

标签 java javafx

在我的代码中,我对监听 SimpleDoubleProperty 的变化很感兴趣。

这是 addListener 的签名方法:

public void addListener(ChangeListener<? super Number> listener)

触发 Double 值更改的属性如何要求它的监听器监听 Number 或其父类(super class)型之一?是不是应该这样定义:

 public void addListener(ChangeListener<? extends Double> listener)

具有以下属性的示例类:

HasObservableProperty.java

public class HasObservableProperty {
     private final SimpleDoubleProperty progress = new SimpleDoubleProperty();
     ...
     public void addProgressChangeListener(ChangeListener<? super Number> listener) {
         progress.addListener(listener);
     }
}

就这样,我有一个监听器定义为:

class ProgressBarNotifier implements ChangeListener<Number> {
    private final ProgressBar progress_bar;

    public ProgressBarNotifier(ProgressBar bar) {
        progress_bar = bar;
   }
   @Override
   public void changed(ObservableValue<? extends Number> progress, Number oldValue,
                        Number newValue) {
        progress_bar.setProgress((Double)newValue);
   }
}

看看我是如何被迫将更改后的值转换为 Double 的:

progress_bar.setProgress((Double)newValue);

如果 addListener 方法具有建议的签名,则情况不应如此。

那么,问题是,SimpleDoubleProperty.addListener 方法是否被错误地声明了?

PS:适用于 SimpleDoubleProperty 的内容似乎也适用于其他可观察对象,例如 SimpleStringProperty .

最佳答案

简单的答案是“因为它就是这样做的”。请注意,正如 Uluk 在评论中指出的那样,您不会被迫转换:您可以调用 doubleValue()Number 上您在监听器方法中收到的引用。

DoubleProperty 背后有一个相当复杂的层次结构.相关部分是 DoubleProperty implements ObservableDoubleValue extends ObservableNumberValue extends ObservableValue<Number> . ObservableValue<T>定义一个 addListener(ChangeListener<? super T>)方法,所以DoubleProperty必须定义 addListener(ChangeListener<? super Number>) .

这是最好的方法吗?实际上我不这么认为:我认为有可能制作ObservableNumberValue通用:ObservableNumberValue<T extends Number> extends ObservableValue<T>然后 ObservableDoubleValue extends ObservableNumberValue<Double> ,此时 addListener(...)方法将放宽到 addListener(ChangeListener<? super Double>) ,这就是您要查找的内容。

层次结构还有其他部分:Property , WritableDoubleValue , WritableNumberValue , WritableValue等,可能会阻止这种结构;但无论如何,现在这样的改变是不可能的,所以我们坚持我们所拥有的,不管这是一个错误,还是有一些我不知道的复杂原因必须这样。偶尔会很烦人,但正如所指出的那样,您始终可以使用 doubleValue() .

在很多情况下,就像您展示的那样,您也可以使用绑定(bind),例如progressBar.progressProperty().bind(progress);

关于java - JavaFX SimpleDoubleProperty.addListener 方法是否声明错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22550668/

相关文章:

java - 强制 EMF 不覆盖实现

java - FXMLLoader 初始化和 SpringBoot - @Configuration

javafx - 代码区右键获取字符索引

应用程序启动方法/位置中的 JavaFX 异常需要修复,无需修复

Java:int[] 数组与 int 数组 []

java - 如何在测试 android 应用程序时隐藏 LeanFT 中的键盘?

java - 如何让一个类使用 applicationContext bean?

Java 等价于 Delphi 的多维数组的 Low() 和 Hi() 函数

java - 如何编写 Java 代码来打印使用 iText 创建的 PDF

java - 仅关闭JavaFX应用程序