在Java中,假设我们有一个带参数double a
的函数。如果我传递一个整数作为参数,它是否工作? (我的意思是,是否存在隐式转换?)而在相反的情况下:如果我有例如一个整数作为参数,我传递一个double?Java:将不同类型的参数传递给函数
不幸的是,我目前无法编译我的代码,我想检查这个断言。 感谢您的关注。
在Java中,假设我们有一个带参数double a
的函数。如果我传递一个整数作为参数,它是否工作? (我的意思是,是否存在隐式转换?)而在相反的情况下:如果我有例如一个整数作为参数,我传递一个double?Java:将不同类型的参数传递给函数
不幸的是,我目前无法编译我的代码,我想检查这个断言。 感谢您的关注。
有关Method Invocation Conversion
的详细信息,请参阅JLS - Section # 5.3。
方法调用上下文允许使用下列之一:
- an identity conversion (§5.1.1) - a widening primitive conversion (§5.1.2) - a widening reference conversion (§5.1.5) - a boxing conversion (§5.1.7) optionally followed by widening reference conversion - an unboxing conversion (§5.1.8) optionally followed by a widening primitive conversion.
所以,你的第一个调用(int
到double
)将根据规则#2做工精细。
但第二次调用(double
到int
)会给编译器错误,根据在同一节进一步引述陈述: -
如果表达式的类型不能被转换到该类型 参数通过在方法调用上下文中允许的转换, 然后发生编译时错误。
谢谢大家的回答! – Pippo
有时你可以通过让你的函数的参数为Number
来解决这个问题。这是Integer
和Double
继承的对象,因此直到Double
数字和Integer
数字行为相同的点,这将起作用。
请注意,基元integer
和double
与对象Integer
和Double
之间存在差异。 Java使用自动装箱功能在函数调用中自动在这些类型之间进行转换等。
是的,这将按照规则#4工作。注意,在装箱之后,你不能从'Integer'扩展到'Double',因为它不是'Integer'的超类型,你必须使用'Number'。 –
因为您可以将double设置为整数,所以integer作为参数可以使用double作为参数。其他方式失败。在这种情况下,你需要将double转换为int。
int i = 6;
double d = 0;
d = i; /* ok
i = d ; /* not ok
传递一个int而不是double,罚款。传递一个float而不是double,很好。传递一个double而不是其中之一?不不不不。 – Clark
我希望Java对此会更“灵活”...... :) – Pippo