Java方法的特殊性

时间:2017-01-07 21:53:47

标签: java overloading jls

我正在尝试理解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。
  •   

并且出于特异性的目的,不考虑类型参数绑定。

是这样的吗? 任何人都可以用简单的语言解释推断比更具体吗?

0 个答案:

没有答案