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

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 ());
  }
}


我期望“ travellerListed(ArrayList)”作为输出。但是我得到“ travellerListed(Collection)”。
是什么原因导致这种意外的过载?

最佳答案

实际上,由于您将"travellerListed(List<Number>)"传递给参数类型为ArrayListmethod,因此您发布的代码实际上是List的结果,因此对于travellerListed的调用,编译器选择private void travellerListed( List s),因为方法重载分辨率由参数的编译时类型确定(这意味着不能选择private void travellerListed( ArrayList i)),而List是比Collection更具体的类型(这说明了为什么未选择private void travellerListed( Collection o)的原因) 。

10-06 06:06