Generics 如何消除ChangeListener的原始类型

Generics 如何消除ChangeListener的原始类型,generics,javafx,javabeans,Generics,Javafx,Javabeans,我正在学习JavaFX中的绑定。我对泛型类型感到困惑。我举一个例子: public static void main(String[] args) { Bill electricBill = new Bill(); electricBill.amountDueProperty().addListener(new ChangeListener(){ @Override public void changed(ObservableValue o,Object

我正在学习JavaFX中的绑定。我对泛型类型感到困惑。我举一个例子:

public static void main(String[] args) {

   Bill electricBill = new Bill();

   electricBill.amountDueProperty().addListener(new ChangeListener(){
      @Override 
      public void changed(ObservableValue o,Object oldVal, Object newVal)
      {
         System.out.println("Electric bill has changed!");
      }
   });

   electricBill.setAmountDue(100.00);

}
它工作得很好,但我决定检查这条线是什么:
electricBill.amountDueProperty().addListener(新的ChangeListener(){…})

没有原始类型。我发现唯一有效的变体是

electricBill.amountDueProperty().addListener(new ChangeListener<Object>(){

    @Override 
    public void changed(ObservableValue<? extends Object> o, Object oldVal, Object newVal) {…}
});
electricBill.amountDueProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(observeValue由于
amountDueProperty()
返回一个
DoubleProperty
,它实现了
observeValue
,因此您可以为任何
T超数
注册一个
ChangeListener
(即
T
可以是
Number
Number
的任何超类):


非常感谢!Number是我要找的。当然lambda运算符也可以工作,但它不会使类型更明确。如果您想显式地声明lambda表达式中的参数,可以为它们提供类型:
addListener((observeValueYeap!我只是想了解代码中发生了什么:)
electricBill.amountDueProperty().addListener(new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue<? extends Number> obs, Number oldValue, Number newValue) {
        double newBill = newValue.doubleValue();
        // ...
    }
});
electricBill.amountDueProperty().addListener((obs, oldValue, newValue) -> {
    // newValue is a Number, by type inference:
    double newBill = newValue.doubleValue();
    // ...
});