【问题标题】:I have got this warning: non-varargs call of varargs method with inexact argument type for last parameter;我收到了这个警告:最后一个参数的参数类型不准确的可变参数方法的非可变参数调用;
【发布时间】:2023-03-12 10:22:02
【问题描述】:

这是我收到警告的示例代码。

Class aClass = Class.forName(impl);
Method method = aClass.getMethod("getInstance", null);
item = (PreferenceItem) method.invoke(null, null);

警告:

警告:最后一个参数的参数类型不准确的可变参数方法的非可变参数调用; 转换为 java.lang.Class 以进行 varargs 调用 强制转换为 java.lang.Class[] 以进行非可变参数调用并抑制此警告 方法method = aClass.getMethod("getInstance", null);

请帮我解决这个问题

【问题讨论】:

    标签: java


    【解决方案1】:

    好吧,编译器警告会告诉您您需要知道的一切。它不知道是将null 视为Class<?>[] 直接传递到getMethod,还是将其视为新Class<?>[] 数组中的单个null 条目。我怀疑你想要前一种行为,所以将null 转换为Class<?>[]

    Method method = aClass.getMethod("getInstance", (Class<?>[]) null);
    

    如果您希望它创建一个带有单个 null 元素的 Class&lt;?&gt;[],您可以将其转换为 Class&lt;?&gt;

    Method method = aClass.getMethod("getInstance", (Class<?>) null);
    

    或者,您可以完全删除参数,并让编译器构建一个空数组:

    Method method = aClass.getMethod("getInstance");
    

    【讨论】:

    • 感谢 Jon 警告已经响起............我刚刚按照你的建议更改了我的代码 aClass.getMethod("getInstance");
    • 如果有人想知道(像我一样),它似乎默认将 null 视为整个数组 Class&lt;?&gt;[],而不是数组中的单个 null 元素(至少根据此处发布的答案: stackoverflow.com/questions/4028059/…)。当然,最好的做法可能是针对特定性进行强制转换,但在考虑是否将采用 Array 作为最后一个参数的方法重构为 varargs 时,最好了解一下。
    • 在 JLS 中的什么地方是这样一个事实的基本原理,即在此示例中,转换为 Class&lt;?&gt; 会生成一个包含单个 null 元素的数组?。
    • @JaimeHablutzel:因为 Class.getMethod(String, Class&lt;?&gt;) 不存在 - 所以 15.12.2 中的前两个阶段找不到任何可以调用的方法。使用 varargs,它可以工作,因为 is 有一个可变的 arity 方法 Class.getMethod(String, Class&lt;?&gt;[]) - 请参阅 15.12.2.4。数组按照 15.12.4.2 构造,参数(值为 null)是数组中的唯一元素。
    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 2011-05-14
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多