Generics 如何消除ChangeListener的原始类型
我正在学习JavaFX中的绑定。我对泛型类型感到困惑。我举一个例子: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
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();
// ...
});