为什么我应该为调用varargs方法显式地转换为null?

时间:2013-08-22 01:11:57

标签: java

我有以下代码:

public static void varargsMethod(String ... strings) {
    if (strings != null && strings.length != 0) {
        for (String s : strings) {
            System.out.println(s);
        }
    } else {
        System.out.println("Hello (string free) world!");
    }
}

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

我想知道为什么第一次使用null作为参数的调用会生成带有提示的警告,需要显式强制转换。从this question的答案来看,我不清楚为什么需要这种演员表。前两个调用工作并产生相同的结果,而第三个调用产生“null”。我明确地想要前两次调用的行为。

对于引用类型和数组,不应该始终有效(并自动转换)吗?我不明白,为什么类型信息在这种情况下很重要。

编辑:使用完全没有参数的变体更新代码。我绝对需要在三种情况之间有所不同(没有数组和空数组以相同的方式处理;数组在另一种情况下具有空值)。我想知道是否有比检查null和空数组更好的方法。

1 个答案:

答案 0 :(得分:2)

只是null可以隐式转换为任何类型,所以在你的情况下它是模棱两可的。所有这些都是可能的:

varargsMethod((String[])null); // pass in a null reference
varargsMethod(new String[]{null}); // pass in a single-element array
varargsMethod((String)null); // equivalent to previous

所以编译器鼓励你指定你的意思。