资源:
public class TestVarArgs {
public void varArgsMethod(Object ... arr) {
System.out.println(arr.getClass().getName());
for(Object o : arr) {
System.out.println(o);
}
}
public static void main(String[] args) {
TestVarArgs tva = new TestVarArgs();
tva.varArgsMethod(args);
}
}
编译:
javac TestVarArgs.java
错误:
TestVarArgs.java:15: warning: non-varargs call of varargs method with inexact argument type for last parameter;
cast to java.lang.Object for a varargs call
cast to java.lang.Object[] for a non-varargs call and to suppress this warning
tva.varArgsMethod(args);
^
1 warning
我正在使用javac 1.6.0_20
,代码o / p表示无论如何都进行了var arg调用。
这是因为String[]
和Object...
不完全匹配。
首先,您必须将强制String[]
转换为Object[]
(如果要将字符串作为单独的参数传递)或Object
(如果只需要一个作为数组的参数)。
tva.varArgsMethod((Object[])args); // you probably want that
tva.varArgsMethod( (Object) args); // you probably don't want that, but who knows?
为什么这是警告而不是错误?向后兼容。在引入varargs之前,您已经使用了这些方法,Object[]
并且在将方法升级为使用varargs之后,针对该方法编译的代码仍应以相同的方式工作。JDK标准库充满了类似的情况。例如java.util.Arrays.asList(Object[])
,java.util.Arrays.asList(Object...)
在Java5中已更改为,使用它的所有旧代码仍应可以编译并无需修改即可工作。
这是我的密码 结果为上述结果之一。从调用仍然调用子类的,即使从词汇上讲,meth调用在超类内部!那么,当是私有的时候,为什么会有不同的行为呢? ___________edit____________ 代码是这样的吗 O/P将是 因此,即使超级类中的正在调用,但实际上子类的正在被调用。所以,方法调用不是词法意义上的!也就是说,即使看起来将调用超级类的meth,实际上它的子类的becoz子类实例首先调
我目前正在设置IntelliJ Inspection Profile,以便它可以在编辑器中指出潜在的问题。但我并没有找到一种方法来指出javac警告“最后一个参数的参数类型不精确的varargs方法的非varargs调用;”。 考虑下面的片段: 在Eclipse中,方法调用,带有下划线(带有一条锯齿状的黄线),但在IntelliJ中,这似乎不会被检查发现。不过,当我在IntelliJ中编译文件时,
我需要帮助我的错误就像 代码:
问题内容: 如果你给 它没有编译,但是带有花括号的相同代码是: 有什么解释? 问题答案: 基本上,变量声明只能在块中声明。 查看 Java语言规范中“语句”的语法 -它包括Block,但不包括LocalVariableDeclarationStatement- 后者是block语法的一部分。 这实际上是实用主义的问题:如果没有括号,则只能使用一个语句。如果没有后续语句,则声明变量是没有意义的,因为
问题内容: 我正在学习Java和OOPS,并在日食中编写基本的Hello World时,我看到一个黄色三角形,告诉我 “实用程序类不应具有公共或默认构造函数” 。我不明白为什么会这样,这是什么意思?我在做什么不对? EDIT1:编辑代码以包括建议的更改。 仍然在类HelloWorld上收到警报。 编辑2: 创建了一个新类,现在可以使用了。谢谢乔恩,为什么旧班级还会发出警告?波希米亚语我仍然不知
问题内容: 这段代码使我凝视了几分钟: 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 这不是一个。 用法: