【问题标题】:Varargs with null parameters in JavaJava中具有空参数的可变参数
【发布时间】:2012-10-13 04:43:01
【问题描述】:

以下代码仅使用空引用作为可变参数。

package currenttime;

import java.util.Arrays;

public class Main
{
    private static void temp(String...str)
    {
        System.out.println(Arrays.asList(str));
    }

    public static void main(String[] args)
    {
        temp(null,null);
        temp(null);
    }
}

第一次调用temp(null, null);方法显示[null, null]意味着str[0]=nullstr[1]=null

但后来对temp(null); 的调用导致NullPointerException 被抛出,看起来str 本身就是null

如果它的类型转换为String 类似temp((String)null);,它会工作并显示[null]

为什么在最后一次调用中,需要显式类型转换? 在我看来,它被认为是一个带有null 引用的字符串数组,这与第一次调用不同。正确答案是什么?

【问题讨论】:

    标签: java variadic-functions


    【解决方案1】:

    在我看来,它被认为是一个带有 null 的字符串数组 与第一次调用不同的参考

    没错。这就是正在发生的事情。

    实际上,precedence 介于:-exact-matchvar-argsboxingtype-casting 之间。

    编译器在检查要调用的方法或参数如何传递时遵循以下优先级:-

    精确匹配 > 类型转换 > 拳击 > Var-args

    所以,您可以看到,var-args 的优先级最低,exact-match 的优先级最高。这意味着,如果 argumentgood-enough 对于 exact-match,那么它将被视为这样。

    现在,当您将null 作为参数传递时,null 可以直接作为value of reference 传递给您的var-args 参数。这是参数的exact match
    因此,您需要将 typecast 明确地 String 告诉它实际上是您的 var-args 参数的第一个元素

    而对于null, null,它将被视为var-argstwo 元素。因为它不能是value of reference

    【讨论】:

    • Arrays.asList(str); 构造一个java.util.List,其中包含null 条目。 String str = null; 与正在创建的 List 的引用无关(不是 null)。
    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2015-06-27
    • 2020-03-16
    相关资源
    最近更新 更多