我现在如何在 Java Fx 上的 属性 Change Listener 上使用通用包装值?

How do I now the generic wrapped value on a Property Change Listener on Java Fx?

我有这个代码:

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 侦听器的方法可以接受任何 TObservableValue<T> 扩展持续时间。

所以简短的回答是 - 如果您没有充分的理由不这样做,请始终使用与您的 ObservableValue 相同类型的参数,因为它是 ChangeListener