我有以下代码:
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和空数组更好的方法。
答案 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
所以编译器鼓励你指定你的意思。