Class[] null
和Object[] null
在下面的代码中是什么意思?
public Object selfFactory() {
Class cl = this.getClass();
Constructor cons;
cons = cl.getConstructor((Class[]) null);
return cons.newInstance((Object[]) null);
}
cl.getConstructor((Class[]) null);
将其值和类型的参数作为类型参数<T>
,因此如果我们为.getConstructor()
的方法调用提供null
Class[]
而不是null
Object
,则强制转换是必要的。
类似地,cons.newInstance((Object[]) null);
通过调用构造函数cons
来创建cl
的新实例,该构造函数采用Object[]
,在本例中给定为null
。如果没有类型转换,将传递一个空的Object
。
这在重载方法或构造函数时非常有用。使用不带强制转换的null
调用的类型为Object
,并且通常不明确:
{
eat(null); // ???
}
void eat(int[] arr);
void eat(Class arr);
通过强制转换,可以调用正确的构造函数或方法。
{
eat((Class) null);
}
也如polygenelubricators在如何使用varargs和反射、中所记录的那样
[…]
invoke(Object obj, Object... args)
使得如果需要将引用类型的数组作为唯一参数传递时变得很棘手,因为它可以强制转换为Object[]
,即使它应该封装在new Object[1]
中。你可以做:
m.invoke(this, new Object[] {a}); // Bohzo's solution
这绕过了vararg机制。更简洁地说,你也可以做:
m.invoke(this, (Object) a);
对
Object
的强制转换使vararg机制为您完成创建数组的工作。当将
null
作为参数传递给varargs时,也需要该技巧,并且与反射无关。public void foo(String... ss) { System.out.println(ss[0]); } foo(null); // causes NullPointerException foo((String) null); // prints "null"