Java 为什么我要显式地为varargs方法的调用强制转换null?

Java 为什么我要显式地为varargs方法的调用强制转换null?,java,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 (s

我有以下代码:

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作为参数的调用会生成一个警告,提示需要显式强制转换。从答案来看,我不清楚为什么需要这个演员阵容。前两个调用工作并产生相同的结果,而第三个调用产生“null”。我明确地想要前两次调用的行为

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


编辑:使用一个完全没有参数的变量更新了代码。我确实需要区分这三种情况(无数组和空数组的处理方式相同;另一种情况下为空值数组)。我想知道是否有比检查null和空数组更好的方法。

只是
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

因此,编译器鼓励您指定您的意思。

链接的答案不包括它吗?因为它不能确定
null
是数组本身还是数组中的第一个值。我刚刚编辑了我的问题。我希望将
null
作为数组,而不是第一个值。我相信它不必做出决定,因为仍然可以得到后一种行为。为什么要传入空数组?这听起来像是你想要一个
NullPointerException
。我个人不想传入一个空数组。然而,我不能为未来的用户提供保证。如果他们在错误的使用上受到NullPointerException的惩罚,我应该处理这个问题还是可以?难道
varargsMethod(null)
不比强制使用它更清晰(也不太详细)吗?你知道这仅仅是一个设计决策还是一个技术原因吗?我想说这是一个技术原因如果你的目标是不带任何参数地调用,从可读性的角度来看,我更喜欢的另一种方法是调用
varagsMethod()
。它不会将字符串设置为null,而是设置为空数组。您的varargsMethod可以通过省略字符串的null检查(假设您不希望允许用户传递显式强制转换的null数组)来稍微清理一下。@Bengt:事实上,我想我本以为
varargsMethod(null)
意味着
varargsMethod((字符串)null)
,因为varargs方法的要点是,您可以并且通常可以提供数组的元素,而不是数组本身。我一直认为,它意味着
varargsMethod((String[])null)
的唯一原因是,设计人员希望在Java 5之前用于获取显式数组参数的任何varargs方法具有严格的向后兼容性,而向后兼容性要求隐式选择
String[]
而不是更直观的
String
@Bengt:我认为如果空数组是一个有效的用例,那么实际上您并不需要varargs方法。人们认为varargs方法采用的是“可变数量的参数,甚至可能是零”——而不是“可变数量的参数,或者可能是其他一些根本不是数量的参数的选项”。当您真正将数组本身视为参数时,使用varargs是一种误导,因此null可能是有意义的。