为什么LongProperty实现Property 而不是Property ?
我在JavaFX API中遇到了似乎特殊的东西: LongProperty
实现Property
,但不实现Property
。
这是什么原因? 我认为这一切都源于Java的协方差和逆变的固有问题,因为generics通过擦除实现愚蠢 ,以保持与字节码的向后兼容性; 但是,通过让LongProperty
实现Property
和 Property
可能会出现什么问题?
编辑:此问题源于此问题: 以编程方式将LongProperty应用于TableColumn(vs语义)
它不能同时实现。
为此,需要在使用generics的接口中实现每个方法的两个版本。 我们以一个为例:
bindBidirectional(Property other) { ... }
在引擎盖下,擦除意味着将其编译为:
bindBidirectional(Property other) { ... }
那么,实现Property
和Property
是什么呢? 它有两种方法:
bindBidirectional(Property other) { ... } bindBidirectional(Property other) { ... }
……在擦除之后,将编译为两种方法:
bindBidirectional(Property other) { ... } bindBidirectional(Property other) { ... }
这两种方法冲突,并且无法在运行时解决它们。
即使您使用了一些编译器技巧来解决这个问题,当有人使用LongProperty作为原始属性时会发生什么?
Property rawLongProperty = new LongProperty(); rawLongProperty.bindBidirectional(someOtherRawProperty);
无法知道这意味着要解决的两个bindDirectional
变体中的哪一个。