Java IntegerProperty实现属性的原因<;数量>;而不是财产<;整数>;?

Java IntegerProperty实现属性的原因<;数量>;而不是财产<;整数>;?,java,generics,javafx,Java,Generics,Javafx,JavaFX添加的属性接口有一个类型参数T,它是属性包装的值的类型 在属性接口的实现中,有一些用于数字:IntegerProperty,FloatProperty等。所有这些类都实现属性 让我们以IntegerProperty为例。为什么它实现了属性,而不是像我预期的那样实现属性 下面是一个UML图,它阐明了IntegerProperty的层次结构: 我想说,它们使用的是Number,因此您可以将这些类与AtomicInteger和BigInteger等一起使用 据我所知,DoubleProp

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

属性
接口的实现中,有一些用于数字:
IntegerProperty
FloatProperty
等。所有这些类都实现
属性

让我们以
IntegerProperty
为例。为什么它实现了
属性
,而不是像我预期的那样实现
属性


下面是一个UML图,它阐明了
IntegerProperty
的层次结构:


我想说,它们使用的是
Number
,因此您可以将这些类与
AtomicInteger
BigInteger
等一起使用

据我所知,
DoubleProperty
IntegerProperty
之间唯一的“真正”区别是方法
setValue(Number v)
——一个使用
v.doubleValue()
,另一个使用
v.intValue()


我这里没有一个工作的javafx环境,所以我无法测试,如果使用
IntegerProperty
Double
会引发异常。

如Java bug报告()的评论部分所述

这种设计是有意的。它使所需方法的数量大大减少


在这个答案的评论中,让我意识到后来有一个关于这个问题的bug报告,)。评论

由于向后兼容性问题,我们决定不更改基元类型属性的泛型(从Number改为specific type)。然而,这意味着这个问题无法解决


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

我有一种似曾相识的奇怪感觉。你以前问过这个问题吗?@Kayaman没有,从来没有问过。我也尽了最大努力检查其他人是否已经这样做了。可能是这样实现的,以便更容易绑定数字属性。参见相关问题-我发现@James_D在这个链接问题中的评论非常有用。他还将这一讨论联系起来——使用
Number
基类对数字的一般处理总是有点棘手。但是请注意,许多强制转换(以及许多错误)都可以很容易地避免:您通常不需要强制转换从此类属性获得的值,如
Integer i=(Integer)p.getValue()
。相反,您通常可以使用适当的方法,如
Integer i=p.getValue().intValue()。(这可能不包括所有情况,但大多数情况下)我必须同意Randahl Isaksen的评论:不过,在我看来,这似乎是对泛型的不当使用。习惯于泛型的Java开发人员会认为使用泛型的水果箱是一个箱子而不是一个箱子。使用泛型的全部目的是确保编译时类型的安全性和更少的强制转换。使用这种设计,您无法完全保证在编译时正确使用类型,并且仍然需要强制转换。我知道这种设计可能会在内部简化您的API,但在外部,这会降低JavaFXAPI的质量。”在JavaFX开发团队稍后的评论中(参见示例),您开始看到“我们试图修复此问题,但为时已晚”“,这向我表明,虽然这可能是有意的,但这是一个错误。还有其他一些解决方案不涉及组合分解API,例如,
公共抽象类NumberProperty实现属性
公共类IntegerProperty扩展NumerProperty
,正如许多人所建议的那样。