使用集合类型重载方法并不像预期的那样工作

时间:2016-06-07 10:47:17

标签: java overloading

考虑以下具有重载方法的类。

public final class TeaParty {
  private void travellerListed( Collection o) { 
    System.out.println("travellerListed(Collection<?>)"); 
  } 
  private void travellerListed( List s) { 
    System.out.println("travellerListed(List<Number>)"); 
  } 
  private void travellerListed( ArrayList i) { 
    System.out.println("travellerListed(ArrayList<Integer>)"); 
  }

  private void method(List t) { 
    travellerListed(t) ; 
  }

   public static void main(String[] args) { 
      TeaParty test = new TeaParty(); 
      test.method(new ArrayList ()); 
  } 
}

我期待&#34; travellerListed(ArrayList)&#34;作为输出。但我得到了&#34; travellerListed(Collection)&#34;。 造成这种意外超载的原因是什么?

1 个答案:

答案 0 :(得分:3)

实际上,您发布的代码会生成"travellerListed(List<Number>)",因为您将ArrayList传递给method,其参数类型为List,因此调用{ {1}}编译器选择travellerListed,因为方法重载解析由参数的编译时类型决定(这意味着无法选择private void travellerListed( List s)),而private void travellerListed( ArrayList i)是一个比List更具体的类型(这解释了未选择Collection的原因)。