对于这段代码(JavaFX)。

StringProperty sp;
DoubleProperty dp;

StringConverter<Double> converter = new DoubleStringConverter();

Bindings.bindBidirectional(sp, dp, converter);

我收到编译错误(在Eclipse IDE中)

这是方法签名:
public static <T> void bindBidirectional(Property<String> stringProperty, Property<T> otherProperty, StringConverter<T> converter)

但是,如果删除(StringConverter的)参数化,那么我只会得到警告,并且代码可以正常工作。
StringConverter converter = new DoubleStringConverter();

我试图避免使用原始类型的泛型,以便不必在我的IDE中禁止显示警告。

最佳答案

这可能是JavaFX属性中的一个小“陷阱”。如果您仔细查看签名:

static <T> void bindBidirectional(Property<java.lang.String> stringProperty,
    Property<T> otherProperty, StringConverter<T> converter)

转换器的参数必须与属性的参数匹配。但是(这里令人惊讶的)DoubleProperty实现了Property<Number>,因此bindBidirectional中的不匹配。幸运的是,解决方案很简单:使用NumberStringConverter:
StringProperty sp = ...;
DoubleProperty dp = ...;
StringConverter<Number> converter = new NumberStringConverter();
Bindings.bindBidirectional(sp, dp, converter);

您可以获得指定转换格式的额外好处。

10-08 09:30