为什么Float有一个构造函数允许double作为参数,而double在JAVA中没有一个构造函数允许Float作为参数?

为什么Float有一个构造函数允许double作为参数,而double在JAVA中没有一个构造函数允许Float作为参数?,java,Java,我在一本JAVA书中读到,有3个用于带有args的float的构造函数:String/float/double。虽然只有两个参数为String/double的double构造函数。所以我的问题是,为什么Double没有一个将float作为参数的构造函数。我想你在问题中已经说了为什么,但只是为了清楚起见: Doubledouble只要传递一个浮点值就可以正常工作,所以不需要Doublefloat。这是因为在a中,a是允许的。float到double是一种扩展的原语转换 但是如果你通过一个双倍的话,

我在一本JAVA书中读到,有3个用于带有args的float的构造函数:String/float/double。虽然只有两个参数为String/double的double构造函数。所以我的问题是,为什么Double没有一个将float作为参数的构造函数。

我想你在问题中已经说了为什么,但只是为了清楚起见:

Doubledouble只要传递一个浮点值就可以正常工作,所以不需要Doublefloat。这是因为在a中,a是允许的。float到double是一种扩展的原语转换


但是如果你通过一个双倍的话,浮动就不好了;你会得到一个失去精确性的警告,因为这是一个错误。因此,通过提供一个Floatdouble构造函数,该构造函数显式声明它将失去精度,API可以编写代码,在没有警告的情况下使用double调用Float的构造函数。你可能会争论这是否是一件好事,而不是让呼叫者在打电话时进行显式浮点运算,但是…

我不完全清楚你在问什么,或者这是否意味着是一个自我回答的问题。你很可能把类型转换和自动装箱搞得一团糟…double是浮点的超集。我可以编译将任意浮点类型传递给任意构造函数的代码。您能提供一个代码示例吗?因为新的Doubledouble由于加宽已经可以使用浮点。它工作得很好。。。因为浮动会自动扩大到双精度。@StephenC:我想在回答时引用JLS中涉及这一点的部分,我不得不承认在分配给任务的两分钟内,我无法向自己证明这是一个关于方法选择的18个条款中的一个条款,而这18个条款可能会引用扩大转换。纯粹出于学术兴趣,如果您碰巧知道方法构造函数选择的正确起点,我很想知道。但如果麻烦的话就不会了-好啊根据5.1.2 float->double是一种加宽原语转换。根据5.3,松散调用上下文允许扩大原语转换。根据15.12.2.3第2阶段:确定松散调用适用的匹配算术方法-如果m不是通用方法,则m通过松散调用适用,如果,对于1≤ 我≤ n、 ei与Fi§5.3在松散调用上下文中兼容,或者ei与适用性无关。