了解Java';瓦拉格斯酒店
给定了解Java';瓦拉格斯酒店,java,variadic-functions,Java,Variadic Functions,给定void foo(Boolean…bars)函数,bars的值的行为与以下函数调用中的值明显不同: foo(),bar=Boolean[0] foo(null),bar=null foo(null,null),bar=Boolean[2]{null,null} 为什么调用foo(null)会产生bar=null而不是Boolean[1]{null}? 这是在Java 8上复制的。这是因为采用了三阶段方法: 确定通过严格调用适用的匹配Arity方法 确定松散调用适用的匹配Arity方法 确
void foo(Boolean…bars)
函数,bars
的值的行为与以下函数调用中的值明显不同:
- foo(),
bar=Boolean[0]
- foo(null),
bar=null
- foo(null,null),
bar=Boolean[2]{null,null}
bar=null
而不是Boolean[1]{null}
?
这是在Java 8上复制的。这是因为采用了三阶段方法:
foo(null)
在第1阶段匹配,因为接受Boolean[]
的方法允许使用单个null参数,因为您可以将null
强制转换为Boolean[]
(或者,实际上,任何引用类型)
foo(null,null)
在第3阶段匹配,因为这是匹配变量arity方法的时候。假设没有2-arg重载foo
,则在此之前无法进行匹配,因为匹配方法需要两个参数。这是因为采用了三阶段方法:
foo(null)
在第1阶段匹配,因为接受Boolean[]
的方法允许使用单个null参数,因为您可以将null
强制转换为Boolean[]
(或者,实际上,任何引用类型)
foo(null,null)
在第3阶段匹配,因为这是匹配变量arity方法的时候。假设您没有foo
的2-arg重载,则在此之前无法对其进行匹配,因为匹配方法将需要两个参数。我希望您得到一个编译器警告。您可以将显式数组传递给varargs参数,对于foo(null)
,您可以猜测这就是您要做的。我希望您能得到编译器的警告。您可以将显式数组传递给varargs参数,对于foo(null)
,您可以猜测这就是您要做的。