3

我使用 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 会抱怨,但它会编译:

最后一个参数的参数类型不准确的可变参数方法的非可变参数调用

无强制转换时:显示参数为空

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

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

这是正常行为吗?

4

4 回答 4

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

在引擎盖下,参数作为 Object[] 包装传递。

但是,您仍然可以选择自己传入该数组。

如果您使用(Object[]) null,您将获得一个参数(即为空)。

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

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

于 2012-06-19T09:00:31.207 回答
0

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

于 2012-06-19T09:00:53.383 回答
0

无强制转换时:显示参数为空

在这种情况下,可变参数为空,所以你得到一个空

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

可变参数包含一个为空的对象(根据您的投射)

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

可变参数您传递的 Object[],它是 null

于 2012-06-19T09:02:26.510 回答
0

没有演员表与演员表相同Object[]。您正在传递一个空参数数组,因此params也是空的。

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

于 2012-06-19T09:02:40.860 回答