Java 过载功能输入。。。而且长。。。同时
我想创建两个函数,比如Java 过载功能输入。。。而且长。。。同时,java,overloading,Java,Overloading,我想创建两个函数,比如 long min(long...); int min(int...); 但是当我尝试调用第二个,即min(1,5)one时,我得到了不明确的方法调用 除了重命名,还有其他解决方法吗?这些方法签名是唯一的,并且是有效的方法重载 问题必须在方法调用参数中。我猜您是在用一个文本调用该方法,如: min(100) 它不喜欢这样,因为100是一个整数,但它会自动转换为长字符 通过在长文本末尾使用L消除方法调用的歧义应该可以解决问题: min(100L) 此外,您还可以使用J
long min(long...);
int min(int...);
但是当我尝试调用第二个,即min(1,5)
one时,我得到了不明确的方法调用
除了重命名,还有其他解决方法吗?这些方法签名是唯一的,并且是有效的方法重载 问题必须在方法调用参数中。我猜您是在用一个文本调用该方法,如:
min(100)
它不喜欢这样,因为100是一个整数,但它会自动转换为长字符
通过在长文本末尾使用L消除方法调用的歧义应该可以解决问题:
min(100L)
此外,您还可以使用Java对象整数和Long显式调用,并让自动装箱处理到基元类型的转换:
min(new Long(100))
min(new Integer(100))
问题是,当您使用
整数调用这些方法时,方法中的无为参数提供精确匹配,就像您使用变量args
一样。另外,var args
都可以将用逗号分隔的int
值作为参数。因此方法不明确
错误
调用重载方法时,编译器首先选择精确匹配。然后选择要强制转换的最近的类型
现在,由于var args
只是一个数组
,编译器在传递整数
值时无法决定使用哪个数组。因此,两个数组都不能被视为精确匹配
或最近转换
。因此,它需要两个方法都符合调用条件
在重载
的情况下,有更多关于方法调用的规则。您可以从Java语言规范
中学习这些内容
正如在Java 7中一样,这个问题已经被修复。但是它在Java版本<7中不起作用。这是一个已知的错误
您描述的行为是一个已经用Java7修复的bug。请参阅“大多数特定Varargs方法选择中的更改”一节中的详细信息
它应该编译的原因
在确定最具体的方法时,变量算术排在最后。在中定义了确定当存在多个变量时应用哪个vararg方法的规则-以下是一个摘录:
一个名为m的变量arity成员方法比另一个同名的变量arity成员方法更具体,如果:
-[…]
-一个成员方法有k个参数,另一个有n个参数,其中n≥ k、 以及:
- 第一种方法的参数类型为U1、…、Uk-1、Uk[]
- 另一种方法的参数类型为T1、…、Tn-1、Tn[]
- 对于从1到n的所有j,Uj试试这个
public class Test {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new Test().m(100L,512L);
new Test().m(100,512);
}
int m(int... i) {
System.out.println("int");
return 0;
}
long m(long... i) {
System.out.println("long");
return 0;
}
}
这是一条varg args,还是仅仅是一条等
消息?这是一条varg args,还是仅仅是一条等
消息?显示您如何调用第二条消息您正在使用的jdk?我使用JDK7运行得很好,但也无法在JDK7上复制。您是否考虑将OP发布的方法作为单参数方法?传递literal100
仅在var args
的情况下失败。否则就行了。编译器选择精确匹配。-1新整数(100)
也没有帮助<代码>100
已经是一个整数+我也是long…
的作用类似于long[]
和int[]
不能被强制转换为long[]
,因此它不会更多specific@assylias.. 如果与var args一起使用,它将不会编译。我认为这就是OP面临的问题。他可能在int和lon上使用var args。@RohitJain看到我的答案了。比较不是在int[]
和long[]
之间,而是在int
和long
@assylias之间。。否。这里的决定是将int
转换为int[]
还是long[]
。您的代码无法编译。请测试一下。@JanDvorak情况并非如此:int[]
不比long[]
更具体,但int...
比long...
更具体。。你试过编译它吗?它没有编译,至少对我来说是这样。@RohitJain我知道发生了什么。更新我的答案。@RohitJain这是Java@assylias中的一个bug。。那么,在这种情况下,OP没有必要使用Java7。在Java7之前,它当然不起作用。因此,我认为我的答案是正确的,不需要投反对票。顺便说一句,感谢您引用它在Java7中工作。到目前为止还没有度过难关。:)@亚西尔亚斯。。嗯,到现在为止我还没有用过Java7。所以,在你告诉我之前,我当然不可能知道这个bug修复。我知道这就是问题所在,所以我没有费心去寻找Java 7中的任何错误修复。@RiaD:它在jdk6中工作得很好。您正在使用哪个jdk?
public class Test {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new Test().m(100L,512L);
new Test().m(100,512);
}
int m(int... i) {
System.out.println("int");
return 0;
}
long m(long... i) {
System.out.println("long");
return 0;
}
}