如何解决我得到的错误:方法 myMethod(int[]) 对于 ArityMethod 类型不明确
运行此代码时出错的原因是什么,
运行 myMethod()
public class ArityMethod {
public static void myMethod(int... arg){
System.out.print("\nmyMethod1 : ");
for (int i : arg) {
System.out.print(i+",");
}
}
public static void myMethod(String... arg){
System.out.print("\nmyMethod2 : ");
for (String str : arg) {
System.out.print(str +" ");
}
}
public static void myMethod1(int a,float b,Object... arg){
System.out.print("\nmyMethod3 a value : "+a);
System.out.print("\nmyMethod3 b value : "+b);
System.out.print("\nmyMethod3 : ");
for (Object str : arg) {
System.out.print(str.toString() +" ");
}
}
public static void main(String[] args) {
myMethod(1,2,3,4,5);
myMethod("hello","welcome","to","Java Discover");
myMethod1(100,3.0f,"hello","Java Discover");
myMethod();
}
}
解决方法
看起来很明显,不是吗? myMethod()
可以指代 myMethod(int... arg)
,可以通过传递 new int[0]
来实现,也可以指代 myMethod(String.. arg)
变体,可以通过传递 new String[0]
来实现。两者都同样有效,因此 java 不知道该调用哪个,因此拒绝编译您的代码。
您有两种三种解决方案:
-
只需使用显式数组调用正确的数组:
myMethod(new int[0])
调用 m1,myMethod(new String[0])
调用 m2。 -
修复您糟糕的 API 设计。通常,您永远不应允许这样做。重命名一个或两个
myMethod
名称以消除歧义,或者确保不会发生这种重叠,例如通过使用void myMethod(int... arg) {}
和void myMethod(String a,String... rest) {}
,从而确保myMethod()
只能引用int...
变体。 -
创建一个明确的无参数版本:
void myMethod() { ... }
,如果您尝试调用myMethod()
,这个版本将优先于其他两个版本。
如果您正在编写此类方法,请使用选项 #2 或 #3。如果这是一个学术练习,或者您被迫处理这样工作的代码,请告诉作者这是糟糕的代码,然后使用显式数组。
编辑:根据@Stephen C 的评论添加了选项 #3。
,在我看来,调用 myMethod() 可以指任何 myMethod(int... args) 或 myMethod(String... args),以及在这种情况下,两者具有相同的优先级。这就是您收到此错误的原因。
关于var-args和重载的详细解释,请参考https://www.geeksforgeeks.org/method-overloading-ambiguity-varargs-java/。这将有助于更好地理解 var-args。
希望一切顺利!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。