我使用java 7,并创建了一个varargs方法
public class JavaApplicationTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
addBundleMessage("b", Integer.SIZE, "key", (Object) null);
}
public static void addBundleMessage(String bundleName, Integer severity, String key, Object... params) {
if (params == null)
System.out.println("params Is null");
else
System.out.println("Params not null");
}
}
如果我没有强制转换对象,那么IDE Netbeans或Eclipse会抱怨,但它会编译:
非varargs调用varags方法,最后用不精确的参数类型 参数
无投放:显示参数无效
当我将null转换为(对象)时,它会显示 Params not null
当我将null转换为(Object [])时,显示 params为null
这是正常行为吗?
答案 0 :(得分:6)
是的,这是“正常”行为。
混淆来自varargs后来用语言固定,并使用数组作为“真实参数”来实现,以保存可变数量的参数。
public static void addBundleMessage(String bundleName, Integer severity,
String key, Object... params) {
与
几乎相同public static void addBundleMessage(String bundleName, Integer severity,
String key, Object[] params) {
并且在引擎盖下,params被包裹为Object []。
但是,您仍然可以选择自己传入该数组。
如果您使用(Object[]) null
,则会获得一个参数(为空)。
如果你使用(Object) null
,它使用varargs方法,所以它传入一个数组来保存参数(其中只有一个是null)。
对于varargs方法的“正常使用”,params
永远不会为空。你可以获得的“最差”是一个空数组(如果根本没有参数)。
答案 1 :(得分:0)
转换不会对null做任何事情,它只会帮助编译器在重载方法之间进行选择。 当您使用多参数方法时,参数将是一个数组,因此您的空测试无关紧要。
答案 2 :(得分:0)
当没有演员:它显示参数为空
在这种情况下,varargs为null,因此您获得null
当我将null转换为(Object)时,它显示Params not null
varargs包含一个对象(根据你的演员表),它是null
当我将null转换为(Object [])时,它显示params为null
varargs 你传递的Object [],这是null
答案 3 :(得分:0)
没有演员阵容与演员Object[]
相同。您正在传递一个null参数数组,因此params
为空。
当您将null转换为Object
时,您传递的是一个null参数,因此params
不是null,而是Object[1]
,其唯一元素为null。 / p>