簡體   English   中英

為什么將(Object)null結果變為null?

[英]Why casting (Object)null result to not null?

我使用java 7,並創建了一個varargs方法

public class JavaApplicationTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        addBundleMessage("b", Integer.SIZE, "key", (Object) null);
    }

    public static void addBundleMessage(String bundleName, Integer severity, String key, Object... params) {
        if (params == null)
            System.out.println("params Is null");
        else
            System.out.println("Params not null");
    }
}

如果我不轉換對象,IDE Netbeans或Eclipse會抱怨,但它會編譯:

非varargs調用varags方法,最后一個參數的參數類型不精確

No cast :它顯示params為null

當我將null轉換為(Object)時,它顯示Params not null

當我將null轉換為(Object [])時,它顯示params為null

這是正常的行為嗎?

是的,這是“正常”的行為。

混淆來自varargs后來用螺栓固定到語言上,並使用數組作為“真實參數”來實現,以保存可變數量的參數。

public static void addBundleMessage(String bundleName, Integer severity,
   String key, Object... params) {

幾乎是一樣的

public static void addBundleMessage(String bundleName, Integer severity,
   String key, Object[] params) {

並且在引擎蓋下,params被包裹為Object []。

但是,您仍然可以自己傳入該數組。

如果使用(Object[]) null ,則會得到一個參數(即null)。

如果使用(Object) null ,它使用varargs方法,因此它傳入一個數組來保存參數(其中只有一個為null)。

對於varargs方法的“正常使用”, params永遠不會為空。 你可以獲得的“最差”是一個空數組(如果根本沒有參數)。

轉換不會對null做任何事情,它只會幫助編譯器在重載方法之間進行選擇。 當您使用多參數方法時,參數將是一個數組,因此您對它的空測試無關緊要。

當No cast:它顯示params為null

在這種情況下,varargs為null,因此您將獲得null

當我將null轉換為(Object)時,它顯示Params not null

varargs包含一個對象(根據您的轉換)為null

當我將null轉換為(Object [])時,它顯示params為null

varargs 你傳遞的Object [],它是null

沒有強制轉換與Object[]的強制轉換相同。 您正在傳遞一個null參數數組,因此params為null。

當您將null轉換為Object ,您傳遞的是一個null參數,因此params不是null,而是一個Object[1] ,它的唯一元素為null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM