在我的代码中,我对收听a的更改感兴趣SimpleDoubleProperty
.
这是addListener方法的签名:
public void addListener(ChangeListener<? super Number> listener)
Run Code Online (Sandbox Code Playgroud)
触发Double
值的属性是如何变换值的,需要它的侦听器才能听到Number
它或其中一个超类型?不应该这样定义:
public void addListener(ChangeListener<? extends Double> listener)
Run Code Online (Sandbox Code Playgroud)
具有该属性的示例类:
HasObservableProperty.java
public class HasObservableProperty {
private final SimpleDoubleProperty progress = new SimpleDoubleProperty();
...
public void addProgressChangeListener(ChangeListener<? super Number> listener) {
progress.addListener(listener);
}
}
Run Code Online (Sandbox Code Playgroud)
所以它是,我有一个听众定义为:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
看看我是如何被迫将更改后的值转换为Double
:
progress_bar.setProgress((Double)newValue);
Run Code Online (Sandbox Code Playgroud)
如果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
generic:ObservableNumberValue<T extends Number> extends ObservableValue<T>
然后ObservableDoubleValue extends ObservableNumberValue<Double>
,此时该addListener(...)
方法将放宽到addListener(ChangeListener<? super Double>)
,这就是您正在寻找的。
层次结构的其他部分:Property
、WritableDoubleValue
、WritableNumberValue
、WritableValue
等可能会阻止这种结构;但无论如何,现在这样的改变是不可能的,所以我们坚持我们所拥有的,无论这是一个错误,还是有一些我不知道的复杂原因。它有时会很烦人,但正如所指出的,您始终可以使用doubleValue()
.
在许多情况下,就像您展示的那样,您还可以使用绑定,例如progressBar.progressProperty().bind(progress);
归档时间: |
|
查看次数: |
1909 次 |
最近记录: |