我正在尝试理解Java如何在重载方法中选择,我发现JLS 15.12.2.5 Choosing the Most Specific Method
我写了以下内容来测试我的理解
public class Foo {
static <T> T f(T x) {
System.err.println("T " + x);
return x;
}
static <T> T f(CharSequence x) {
System.err.println("CharSequence " + x);
return null;
}
public static void main(String... argv) {
CharSequence c = "c";
String s = "s";
Foo.f(c); // Prints "CharSequence c"
Foo.f(s); // Prints "CharSequence s"
Foo.<String>f(s); // Prints "CharSequence s". Why???
}
}
我对Foo.<String>f(s)
电话感到惊讶。我对特异性的天真理解是,在模板参数替换后,Foo.<String>f(s)
应用于f
的两个重载,其中f(String)
和f(CharSequence)
的第一个更具体。
第15.12节有点难以理解,但看起来像是操作部分
- m2是通用的,并且根据§18.5.4推断m1比参数表达式e1,...,ek更具体m2。
并且出于特异性的目的,不考虑类型参数绑定。
是这样的吗? 任何人都可以用简单的语言解释推断比更具体吗?