gpt4 book ai didi

java - 重载函数 int... 和 long... 同时

转载 作者:行者123 更新时间:2023-12-03 22:46:27 26 4
gpt4 key购买 nike

我想创建两个函数,比方说

long min(long...);
int min(int...);

但是当我尝试调用第二个,即 min(1, 5) 时,我得到了不明确的方法调用

除了重命名之外还有解决方法吗?

最佳答案

这是一个已知错误

您描述的行为是 Java 7 已修复的错误。请参阅 release notes 中的详细信息,名为“大多数特定 Varargs 方法选择的变化”部分。

为什么要编译

在确定最具体的方法时,变量数量排在最后。 JLS 15.12.2.4 中定义了当存在多个可变参数方法时确定应用哪种可变参数方法的规则。 - 这是摘录:

One variable arity member method named m is more specific than another variable arity member method of the same name if either:
- [...]
- One member method has k parameters and the other has n parameters, where n ≥ k, and:

  • The types of the parameters of the first method are U1, ..., Uk-1, Uk[].
  • The types of the parameters of the other method are T1, ..., Tn-1, Tn[].
  • For all j from 1 to n, Uj <: Tj

在您的例子中,k = n,并且 U1[] = int[]T1[] = long[]所以可以确定如果 int <: long或相反。

换句话说,考虑的类型不是int[]long[]但是int对比long .碰巧 int <: long所以 int...应该选择方法并且应该编译它。

结论:

代码应该(并且确实)在 Java 7 中编译良好,但在 Java 5 或 6 中无法编译。下面的代码打印出 int。使用 Java 7:

public class Test1 {
public static void main(String[] args) {
new Test1().m(1, 2);
}
int m(int... i) {
System.out.println("int");
return 0;
}
long m(long... i) {
System.out.println("long");
return 0;
}
}

关于java - 重载函数 int... 和 long... 同时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13524166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com