我在这里有一个非常棘手的案例,有泛型和方法重载.看看这个示例类:
public class Test {
public <T> void setValue(Parameter<T> parameter, T value) {
}
public <T> void setValue(Parameter<T> parameter, Field<T> value) {
}
public void test() {
// This works perfectly. <T> is bound to String
// ambiguity between setValue(.., String) and setValue(.., Field)
// is impossible as String and Field are incompatible
Parameter<String> p1 = getP1();
Field<String> f1 = getF1();
setValue(p1, f1);
// This causes issues. <T> is bound to Object
// ambiguity between setValue(.., Object) and setValue(.., Field) …Run Code Online (Sandbox Code Playgroud) 如果我只声明2个varargs方法如下:
public void foo(String... strings) {
System.out.println("Foo with Strings");
}
Run Code Online (Sandbox Code Playgroud)
和
public void foo(int... ints) {
System.out.println("Foo with ints");
}
Run Code Online (Sandbox Code Playgroud)
然后有代码:
foo();
Run Code Online (Sandbox Code Playgroud)
由于预期的模糊性,这是编译器错误.
但是,如果我只有以下2个版本的foo:
public void foo(Object... objects) {
System.out.println("Foo with Objects");
}
Run Code Online (Sandbox Code Playgroud)
和
public void foo(int... ints) {
System.out.println("Foo with ints");
}
Run Code Online (Sandbox Code Playgroud)
那么代码
foo();
Run Code Online (Sandbox Code Playgroud)
调用方法的int版本.任何人都可以解释为什么第二个例子不是同样含糊不清,为什么它解析为Object方法的int方法.谢谢.
有人可以帮助我理解JLS的第15.12.2.5节:最具体的方法吗?
(来自JLS的强行剪切和粘贴如下)
另外,一个名为m的变量arity成员方法比另一个具有相同名称的变量arity成员方法更具体:
- 一个成员方法有n个参数,另一个成员方法有k个参数,其中n> = k.第一个成员方法的参数类型是T1 ,. ..,Tn-1,Tn [],其他方法的参数类型是U1 ,. ..,Uk-1,英国[].如果第二种方法是通用的,那么让R1 ... Rp p1成为它的形式类型参数,让Bl成为Rl的声明边界,1lp,让A1 ... Ap成为推断的实际类型参数(§15.12.2.7)对于这种在初始约束下的调用Ti << Ui,1ik-1,Ti << Uk,kin和let Si = Ui [R1 = A1,...,Rp = Ap] 1ik; 否则让Si = Ui,1ik.然后:对于从1到k-1的所有j,Tj <:Sj,并且对于从k到n的所有j,Tj <:Sk,并且,如果第二种方法是如上所述的通用方法,那么Al <:Bl [R1 = A1,...,Rp = Ap],1lp.
- 一个成员方法具有k个参数,另一个具有n个参数,其中n> = k.第一种方法的参数类型是U1 ,. ..,Uk-1,Uk [],其他方法的参数类型是T1 ,. ..,Tn-1,Tn [].如果第二种方法是通用的,那么让R1 ... Rp p1成为它的形式类型参数,让Bl成为Rl的声明边界,1lp,让A1 ... Ap成为推断的实际类型参数(§15.12.2.7)对于这种在初始约束条件下的调用,Ui << Ti,1ik-1,Uk << Ti,kin和令Si = Ti [R1 = A1,...,Rp = Ap] 1in; 否则让Si = Ti,1in.然后:对于从1到k-1的所有j,Uj <:Sj,并且对于从k到n的所有j,Uk <:Sj,并且,如果第二种方法是如上所述的通用方法,则Al <:Bl [R1 = A1,...,Rp = Ap],1lp.
忽略问题泛型,这是否意味着varargs比子类型更重要,或者在确定一种方法是否比另一种更具体时,子类型比varargs更重要?我无法弄清楚. …