2015-08-09 38 views
1

我是新來的Java,並試圖瞭解下面的代碼:方法可以返回多種類型的

int methodOfA() 
    { 
     return (true ? null : 0); 
    } 

方法的返回類型爲int,但它可以返回空值和INT,是Java這種正確的行爲? Java方法可以返回多個類型嗎?對於那些有經驗的人來說,這聽起來很愚蠢,但我剛剛在Java中邁出了第一步。

+3

是的,它編譯沒有錯誤 –

回答

5

的方法不能返回多個類型。

如果該方法不返回任何內容,則方法的簽名包含返回類型或void。由於它必須在方法簽名中定義,所以您必須必須返回該類型的內容。

代碼

return (true ? null : 0); 

是一個速記if-else語句,或條件表達式三元,和可以改寫該:

if (true) { 
    return null; 
} 
else { 
    return 0; 
} 

上面的代碼,但是,不會因爲如果返回類型是 primitive type int ,則不能返回null。上面的代碼將被編譯,因爲JVM會嘗試將null轉換爲int。在運行時,它會拋出一個NullPointerException,如pointed out by Eran

爲了「回報多種類型的」,你可以做到以下幾點:

public class BooleanOrInt { 

    private boolean isInteger; // Whether value is boolean or int 
    private boolean b; 
    private int i; 

    public BooleanOrInt(boolean b) { 
     this.b = b; 
     this.isInteger = false; 
    } 

    public BooleanOrInt(int i) { 
     this.i = i; 
     this.isInteger = true; 
    } 

    public boolean isInteger() { 
     return this.isInteger; 
    } 
} 

然後你的代碼應該如下:

BooleanOrInt methodOfA() { 
    if (some_condition) { 
     return new BooleanOrInt(the_boolean_you_want); 
    } 
    else { 
     return new BooleanOrInt(the_integer_you_want); 
    } 
} 
+0

如果我想從同一個方法返回boolean和int,該怎麼辦? –

+0

@AyushiShah - 如果是這樣的話,那麼你應該將它們包裝在一個類中,並從該方法返回該類的對象!在這種情況下,您的方法返回類型將更改爲Class類型。 –

+0

@AyushiShah你不能。 –

4

這是一個條件表達式三元,這意味着該方法返回下列的?兩個值中的一個,這取決於條件評估他出現之前?(在你的情況總是返回true)。

表達式(true ? null : 0)的類型是Integer,因爲這是null0的常見類型。

您的代碼將拋出一個NullPointerException,因爲當您在返回類型爲int方法返回一個nullInteger,JVM將嘗試轉換的Integerint和失敗。

爲了解決此代碼,就必須改變返回類型Integer(其是用作用於int原語類型的包裝的引用類型):

Integer methodOfA() 
{ 
    return (true ? null : 0); 
} 
+2

它不會給我編譯錯誤,即使我保留INT作爲返回類型 –

+0

@AyushiShah是的,我只是修復了答案。 – Eran

+0

我相信int和Integer都是一樣的,如果我錯了,糾正我? –

0

Java方法不能返回多於一個類型在你建議的形式。但是,它可以返回任意數量的子類型。在你的情況下,int是一個原始類型,它不能有子類型。在這裏你不能返回null,因爲null只能由返回類型是對象的方法返回。對於基元,你必須指定一些值(在你的情況下爲0)。