【发布时间】:2011-05-16 21:06:41
【问题描述】:
谁能帮我理解section 15.12.2.5 of the JLS re: most specific method?
(随后是来自 JLS 的大棒剪切和粘贴)
此外,一个名为 m 的可变参数成员方法比另一个同名可变参数成员方法更具体,如果:
- 一个成员方法有 n 个参数,另一个有 k 个参数,其中 n >= k。第一个成员方法的参数类型为 T1, 。 . . , Tn-1 , Tn[], 其他方法的参数类型为 U1, . . . , Uk-1, Uk[]。如果第二种方法是泛型的,则令 R1 ... Rp p1 为其形式类型参数,令 Bl 为 Rl、1lp 的声明边界,令 A1 ... Ap 为推断的实际类型参数(第 15.12.2.7 节)对于初始约束下的此调用 Ti
- 一个成员方法有 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
忽略泛型问题,这是否意味着在决定一种方法是否比另一种方法更具体时,可变参数比子类型更重要,或者子类型比可变参数更重要?我想不通。
具体示例:根据 JLS,以下哪个 compute() 方法“更具体”?
package com.example.test.reflect;
class JLS15Test
{
int compute(Object o1, Object o2, Object... others) { return 1; }
int compute(String s1, Object... others) { return 2; }
public static void main(String[] args)
{
JLS15Test y = new JLS15Test();
System.out.println(y.compute(y,y,y));
System.out.println(y.compute("hi",y,y));
}
}
我不知道哪个“更具体”;输出打印
1
2
我很困惑如何解释结果。当第一个参数是字符串时,编译器会选择具有更具体子类型的方法。当第一个参数是 Object 时,编译器会选择可选 varargs 数量较少的方法。
注意:如果您没有阅读 JLS 的这一部分,并且您给出的答案取决于 参数的类型,那么您没有帮助我.如果您仔细阅读 JLS,除了与泛型相关的部分之外,“更具体”的定义取决于声明的参数,而不是实际的参数——这在JLS(暂时找不到)。
例如对于固定数量的方法,compute(String s) 将比compute(Object o) 更具体。但我试图了解 JLS re: variable arity methods 的相关部分。
【问题讨论】:
-
@David @Jason - 据我所知,您不能在第一种方法中将第一个参数的类型更改为 String 。因为它符合上述部分的最后一行 -
we say that the method invocation is ambiguous, and a compile-time error occurs。 -
我认为 Jon Skeet 现在正在睡觉......
-
啊。我只是想在我的原始帖子中放一个具体的例子,作为从 JLS 的措辞中去除抽象性的一种方式,相反,它所做的只是将注意力集中在具体的例子上,而不是 JLS 上。
-
请查看编辑后的答案,我想我找到了一个符合您问题的案例。
标签: java variadic-functions jls