2012-11-07 121 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 
相關問題