为什么将(Object)null结果变为null?

时间:2012-06-19 08:57:07

标签: java variadic-functions

我使用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方法,最后用不精确的参数类型   参数

无投放:显示参数无效

当我将null转换为(对象)时,它会显示 Params not null

当我将null转换为(Object [])时,显示 params为null

这是正常行为吗?

4 个答案:

答案 0 :(得分:6)

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

混淆来自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,则会获得一个参数(为空)。

如果你使用(Object) null,它使用varargs方法,所以它传入一个数组来保存参数(其中只有一个是null)。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

当没有演员:它显示参数为空

在这种情况下,varargs为null,因此您获得null

  

当我将null转换为(Object)时,它显示Params not null

varargs包含一个对象(根据你的演员表),它是null

  

当我将null转换为(Object [])时,它显示params为null

varargs 你传递的Object [],这是null

答案 3 :(得分:0)

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

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