【发布时间】:2016-01-05 20:21:31
【问题描述】:
我在 JavaFX API 中发现了一个似乎很特殊的东西:LongProperty 实现了 Property<Number>,但不是 Property<Long>。
这是什么原因?我有点理解这一切都源于 Java 固有的协变和逆变问题,因为泛型通过擦除实现愚蠢,以保持与字节码的向后兼容性;但是让LongProperty 同时实现Property<Number> 和 Property<Long> 会出现什么问题?
编辑:这个问题源于这个问题:Apply LongProperty to TableColumn programmatically (vs semantically)
【问题讨论】:
-
嗯...我想我可能是太仓促了,没有完全理解Java的协变和逆变,所以它可能根本不是问题。很抱歉。
-
(这里不假设答案 - 只是对@sillyfly的一个问题)。 Long 是 Number 的一个子类,所以它不是通过它的父类固有地实现的——也许只需要一个演员表?
-
我认为这是一个错误。设计应该类似于
abstract class NumberProperty<N extends Number> implements Property<N>,然后是class IntegerProperty extends NumberProperty<Integer>等。 -
这可能与
Property方法的使用方式有关。像这样的东西可以作为一个特性而不是一个错误存在,以允许更宽松的使用。请注意,它的其他超级接口以long的形式提供访问权限。 -
@Radiodef 嗯,是的,但是现在你可以这样做
LongProperty lp = new SimpleLongProperty();、DoubleProperty dp = new SimpleDoubleProperty();dp.bindBidirectional(lp);dp.set(1.5);,现在你有了dp.getValue().equals(lp.getValue()) == false,即使它们是双向绑定的。如果他们没有这样做的话,API 中的不一致性比缺乏灵活性更糟糕。 (请记住,您仍然可以实例化SimpleObjectProperty<Number>,因此您可以使用该机制绑定包含任何类型数字的可观察对象。)