所以,标题就是一切。当我尝试使用.newInstance在Object数组中传递参数时,我收到一个错误:
java.lang.IllegalArgumentException:参数类型不匹配 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at me.voxed.textrpg.RoomCreator.setNorth(RoomCreator.java:44) 在me.voxed.textrpg.Game。(Game.java:89) 在me.voxed.textrpg.Program.main(Program.java:6)
这是我正在使用的功能:
public void setNorth(String block, String... args){
try {
Object[] argsObj = args;
Class<? extends Block> clazz = (Class<? extends Block>) (GameRegistry.getBlock(block));
_north = clazz.asSubclass(Block.class).getConstructor(Object[].class).newInstance(argsObj);
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
| NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
}
clazz是这堂课:
public class BlockNPCSpawnBars extends BlockNPC {
public BlockNPCSpawnBars(Object[] args) {
super(args);
}
我做错了什么?
答案 0 :(得分:1)
newInstance
采用可变参数。当你传递一个数组时,它会转换为varargs调用,就好像该数组中的每个元素都是构造函数的一个单独的参数一样。
这通常解决如下:
...newInstance((Object) argsObj);
这将确保数组作为单数参数传递,就像您的实际构造函数所期望的那样。