在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