我有这个代码:
circle2.radiusProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
System.out.println("Change detected for " + observable);
circle1.setRadius(newValue.doubleValue());
}
});
final IntegerProperty lapCounterProperty = new SimpleIntegerProperty();
pathTransition.currentTimeProperty().addListener(new ChangeListener<Duration>() {
@Override
public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
}
});
我怎么知道ChangeListener<>
的类型参数应该是什么?
addListener
方法来自 ObservableValue<T>
,它定义了
void addListener(ChangeListener<? super T> listener)
而ChangeListener<S>
定义:
void changed(ObservableValue<? extends S> observable, S oldValue, S newValue)
保持简单(通常没有理由不这样做),如果你有一个ObjectProperty<Duration>
(这就是PathTransition#duration
)是,你会想要使用一个ChangeListener<Duration>
,它将具有changed
签名的方法:
void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue)
但是您也可以对任何超T
使用ChangeListener<T>
,例如Duration
的超类型(例如Object
),而侦听器的changed
方法可以接受任何延长持续时间的T
的ObservableValue<T>
。
所以简短的回答是 - 如果你没有充分的理由不这样做,请始终使用与ObservableValue
相同的类型参数,因为它ChangeListener
。