为什么LongProperty实现Property <number>而不是Property <long>?

时间:2016-01-05 20:21:31

标签: java generics javafx

我遇到了JavaFX API中的一个特点:LongProperty实现Property<Number>,但不是Property<Long>

这是什么原因?我有点认为这一切都源于Java的协方差和逆变的固有问题,因为通过擦除实现了愚蠢的泛型,以保持与字节码的向后兼容性;但是LongProperty实现Property<Number> Property<Long>会产生什么问题?

编辑:此问题源自此问题:Apply LongProperty to TableColumn programmatically (vs semantically)

1 个答案:

答案 0 :(得分:4)

不能实现这两者。

为此,需要在使用泛型的接口中实现每个方法的两个版本。我们以一个为例:

bindBidirectional(Property<Long> other) { ... }

在引擎盖下,擦除意味着将其编译为:

bindBidirectional(Property other) { ... }

那么,实现Property<Number>Property<Long>会有什么作用呢?它有两种方法:

bindBidirectional(Property<Long> other) { ... }
bindBidirectional(Property<Number> other) { ... }

......在擦除后,将编译为两种方法:

bindBidirectional(Property other) { ... }
bindBidirectional(Property other) { ... }

这两种方法冲突,并且无法在运行时解决它们。

即使您使用了一些编译器技巧来解决这个问题,当有人使用LongProperty作为原始属性时会发生什么?

Property rawLongProperty = new LongProperty();
rawLongProperty.bindBidirectional(someOtherRawProperty);

我们无法知道这两个bindDirectional变体中的哪一个要解决这个问题。