2012-11-07 84 views
4

在Java中,假设我们有一个带参数double a的函数。如果我传递一个整数作为参数,它是否工作? (我的意思是,是否存在隐式转换?)而在相反的情况下:如果我有例如一个整数作为参数,我传递一个double?Java:将不同类型的参数传递给函数

不幸的是,我目前无法编译我的代码,我想检查这个断言。 感谢您的关注。

+3

传递一个int而不是double,罚款。传递一个float而不是double,很好。传递一个double而不是其中之一?不不不不。 – Clark

+0

我希望Java对此会更“灵活”...... :) – Pippo

回答

10

有关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. 

所以,你的第一个调用(intdouble)将根据规则#2做工精细。

但第二次调用(doubleint)会给编译器错误,根据在同一节进一步引述陈述: -

如果表达式的类型不能被转换到该类型 参数通过在方法调用上下文中允许的转换, 然后发生编译时错误。

+0

谢谢大家的回答! – Pippo

1

有时你可以通过让你的函数的参数为​​Number来解决这个问题。这是IntegerDouble继承的对象,因此直到Double数字和Integer数字行为相同的点,这将起作用。

请注意,基元integerdouble与对象IntegerDouble之间存在差异。 Java使用自动装箱功能在函数调用中自动在这些类型之间进行转换等。

+0

是的,这将按照规则#4工作。注意,在装箱之后,你不能从'Integer'扩展到'Double',因为它不是'Integer'的超类型,你必须使用'Number'。 –

1

因为您可以将double设置为整数,所以integer作为参数可以使用double作为参数。其他方式失败。在这种情况下,你需要将double转换为int。

int i = 6; 
    double d = 0; 
    d = i; /* ok 
    i = d ; /* not ok 
相关问题