在我的代码中,我有兴趣听SimpleDoubleProperty的更改。

这是addListener方法的签名:

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

引发对Double值的更改的属性如何要求它的侦听器侦听Number或其超级类型之一?它不应该这样定义:
 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>),这就是您要寻找的。

层次结构中还有其他所有部分:PropertyWritableDoubleValueWritableNumberValueWritableValue等,可能会阻止这种结构。但是无论如何现在这样的改变是不可能的,所以我们被束之高阁,不管是一个错误还是某种复杂的原因,我必须不知道这种方式。有时会很烦人,但正如您指出的那样,您始终可以使用doubleValue()

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

07-25 23:39
查看更多