![](/img/trans.png)
[英]Does casting null to an array of objects cost more than casting to an object?
[英]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.