2012-06-19 213 views
3

我用Java 7中,我创建一个可变参数方法为什么铸造(对象)空结果不为空?

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"); 
    } 
} 

如果我不投的对象,在Netbeans的集成开发环境Eclipse或抱怨,但它编译:

的非可变参数调用varags法不精确的参数类型为去年 参数

没有投:它显示PARAM s为null

当我投null以(对象)它显示PARAMS不是null

当我投null以(对象[])它显示params为null

这是正常行为吗?

回答

6

是的,这是“正常”的行为。

混淆来自可变参数后来被锁定在语言上,并且正在使用数组作为“实参”来实现可变数量的参数。

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)。

对于可变参数法的“正常使用”,params永远不会为空。你可以得到的“最差”是一个空数组(如果根本没有参数的话)。

0

该转换不会对null做任何事情,它只会帮助编译器在重载的方法之间进行选择。 由于您使用的是多参数方法,参数将是一个数组,因此您的空测试不相关。

0

当没有投:它显示params为null

的可变参数为空在这种情况下,让你获得一个空

当我投零至(对象),它显示PARAMS NOT NULL

的可变参数包含一个对象(根据你的铸造),这是空

当我投零到(对象[])的显示params为null

的可变参数 []你传递的对象,这是空

0

没有中投的与演员阵容一样Object[]。您正在传递一个空参数数组,因此params为null。

当您将null转换为Object时,您传递的是单个null参数,因此params不为空,而是Object[1],它的唯一元素为null。