在jdk1.5之前,也就是没有出现重载的可变参数特性之前,invoke(Object obj, Object... args),多参数是通过一个Object数组传递进去的,也就是invoke(Object obj, Object[] args).
在楼主的例子中main方法接收的参数是String[] args这个数组。在执行代码methodMain.invoke(null, new String[]{"jeek", "wong"});时,我们的本意是将new String[]{"jeek", "wong"}作为一个Object参数传递给invoke方法,如果按照jdk1.5,执行方法invoke(Object obj, Object... args),这显然是符合规范的,貌似我们这样做是没有错的,这是为什么会编译出错,并且提示:参数的个数不对。
我们不难想到编译器实际上把new String[]{"jeek", "wong"}解析成了一个Object的数组,所以导致了参数不一致的情况,这又是为什么呢?查询文档可知,在实际编译过程中,编译器会根据参数类型选择性的调用invoke(Object obj, Object... args)或者jdk1.5之前定义的方法invoke(Object obj, Object[] args)。这样就不难理解为什么编译器把new String[]{"jeek", "wong"}解析成了一个Object数组,因为它选择使用了invoke(Object obj, Object[] args)方法。
为了解决这个问题,我们可以将其转型为Object类型,即(Object)new String[]{"jeek", "wong"}或者显式地将其保存在一个Object数组中new Object[]{new String[]{"jeek", "wong"}}。这样就避免了歧义的发生。
希望我的回答能够帮助到楼主。 |