java - 使用集合类型重载的方法无法按预期工作

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

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

最佳答案

实际上,您发布的代码结果为 "travellerListed(List<Number>)" ,因为您正在传递 ArrayListmethod ,其参数类型为 List ,因此调用 travellerListed编译器选择private void travellerListed( List s) ,因为方法重载解析是由参数的编译时类型决定的(这意味着不能选择private void travellerListed( ArrayList i)),并且List是比 Collection 更具体的类型(这解释了为什么不选择private void travellerListed( Collection o))。

关于java - 使用集合类型重载的方法无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37677240/

相关文章:

java - 使用 Firebase 在 Android Studio 中进行 JUnit 测试

java - 如何使用 Ant 将 Classpath Jas 包含在 war 文件中

c++ - 谷歌模拟 : Mocked overloaded functions create warning C4373

c++ - 在 C++ 中重载模板类中的成员函数

java - 在 Dagger 中读取环境变量

java - 很好的免费 sqlite gui 工具

java - Thread.join - 主线程不会恢复执行

c++ - 重载运算符 '=' 和 '+'

c++ - 为什么在给定 T&& 和 const T& 重载的情况下,const 左值与 const 右值的绑定(bind)不同?

xcode - 快速重载初始化()