为什么IntegerProperty实现Property <Number>而不是Property <Integer>?

Pao*_*oni 5 java generics javafx

PropertyJavaFX添加的接口有一个类型参数T,它是属性包装的值的类型.

其中的实现Property接口,还有一些用于数字:IntegerProperty,FloatProperty,等所有这些类实现Property<Number>.

我们IntegerProperty举个例子.它实施的原因是什么,Property<Number>而不是Property<Integer>我所期望的?


这是一个UML图,阐明了以下层次结构IntegerProperty:

在此输入图像描述

Mod*_*ens 5

正如Java错误报告的注释部分所述(DoubleProperty具有意外的泛型类型),

这个设计是有意的.它使所需方法的数量显着减少.


在这个答案的评论中,James_D让我意识到后来的错误报告解决了这个问题,ChangeListener无法添加到SimpleIntegerProperty中.评论

由于向后兼容性问题,我们决定不更改基本类型属性的泛型(从Number到特定类型).但是,这意味着无法修复此问题.

表明团队考虑改变设计,但为时已晚.

  • 我不得不同意Randahl Isaksen的评论:"不过,对我而言,这似乎是对泛型的不当使用.习惯于泛型的Java开发人员会期望使用泛型的FruitCrate是Crate <Fruit>而不是Crate <Object>.使用泛型的整个目的是确保编译时类型的安全性和更少的转换.使用这种设计,你不能完全保证在编译时正确使用类型,你仍然需要转换.我知道这个设计可以在内部简化您的API,但在外部,这会降低JavaFX API的质量." (3认同)
  • 在JavaFX开发团队稍后的评论中(参见例如http://mail.openjdk.java.net/pipermail/openjfx-dev/2014-February/012739.html),您开始看到对"我们试图修复此问题"的引用但是为时已晚,"这对我来说,虽然它可能是有意的,但这是一个错误.还有其他解决方案不涉及组合爆炸API,例如`public abstract class NumberProperty <N extends Number> implements Property <N>`和`public class IntegerProperty extends NumerProperty <Integer>`,正如数字所暗示的那样人 (3认同)