用反射调用空arg构造函数的编译器警告

时间:2013-08-10 23:12:16

标签: java

这很有效:

this.getClass().getConstructor(null).newInstance(null);

但我想摆脱这个警告:

“null类型的参数应该显式地转换为Class [],以便从类型Class调用varargs方法getConstructor(Class ...)。它也可以转换为类以进行varargs调用”

1 个答案:

答案 0 :(得分:5)

你说:

  

这很有效:

this.getClass().getConstructor(null).newInstance(null);

事实上它并不“很好”。它编译(带有重要的警告),然后编译的代码会产生运行时异常。

您的代码实际上与此相同:

  this.getClass().getConstructor((Class[]) null).newInstance(null);

并且导致问题的是getConstructor((Class[]) null)调用。那个电话是说“给我一个构造函数......但我不是说参数类型是什么”。这不起作用。 getConstructor(Class ...)方法不进行通配符/模糊匹配。 (编译器建议的替代方案...... getConstructor((Class) null) ...也不起作用。)


那么修复是什么?

  • 如果您尝试选择“no-args”构造函数,那么您应该这样写:

    getConstructor()
    

    getConstructor(new Class[0])   // equivalent
    

    或用以下内容替换完整的陈述:

    this.getClass().newInstance()
    
  • 如果您尝试选择“任何带有一个参数的构造函数”或类似的东西,那么您将需要使用getConstructors()。然后,您需要遍历结果数组以选择所需的构造函数。

  • 如果您尝试做其他事情,则需要解释。