Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用集合类型重载方法不会';I don’我没有按预期工作_Java_Overloading - Fatal编程技术网

Java 使用集合类型重载方法不会';I don’我没有按预期工作

Java 使用集合类型重载方法不会';I don’我没有按预期工作,java,overloading,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&

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

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 ()); 
  } 
}
公共期末班茶话会{
私人旅行社名单(集合o){
System.out.println(“TravellerList(Collection)”;
} 
列名私人旅客(名单s){
System.out.println(“TravellerList(列表)”;
} 
私人旅行社名单(ArrayList i){
System.out.println(“TravellerList(ArrayList)”;
}
私有无效方法(列表t){
旅客名单(t);
}
公共静态void main(字符串[]args){
茶党测试=新茶党();
方法(新的ArrayList());
} 
}
我期望“TravellerList(ArrayList)”作为输出。但我得到了“travellerListed(Collection)”。
造成这种意外重载的原因是什么?

实际上,您发布的代码会导致
TravellerList(List)
,因为您将
数组列表
传递给
方法
,该方法的参数类型是
列表
,因此对于
TravellerList
的调用,编译器选择
私有void TravellerList(列表s)
,因为方法重载解析是由参数的编译时类型决定的(这意味着不能选择
private void travellerListed(ArrayList i)
),而
列表
是比
集合
更具体的类型(这解释了
private void travellerListed(集合o)的原因)
未选择)。

实际上,您发布的代码会导致
TravellerList(列表)
,因为您将
数组列表
传递给
方法
,其参数类型为
列表
,因此对于
TravellerList
的调用,编译器选择
私有void TravellerList(列表s)
,因为方法重载解析是由参数的编译时类型决定的(这意味着不能选择
private void travellerListed(ArrayList i)
),而
列表
是比
集合
更具体的类型(这解释了
private void travellerListed(集合o)的原因)
未选中)。

术语提示:这些不是“泛型”类型(从“泛型”的角度来看,您实际上在这里使用的是原始类型;这些类型……一开始就不应该使用)。所以,这只是关于重载,以及编译器选择哪个版本。如果你仔细观察……你会发现是的,你确实重载了;但是你从来没有在这里调用重载方法!关于泛型类型(与你的问题无关):泛型类型仅在编译期间使用。在运行时,泛型类型不可用(类型擦除),因此您不能将
void travellerListed(List value)
void travellerListed(List value)
一起使用,因为这些签名在运行时是相同的。术语提示:这些不是“泛型”类型(从“泛型”的角度来看,您实际上在这里使用的是原始类型;这……首先不应该使用)。因此,这只是关于重载,以及编译器选择哪个版本。如果您更仔细地观察……您会发现,是的,您使用了重载;但您在这里从来没有调用重载方法!关于泛型类型(与您的问题无关):泛型类型仅在编译期间使用。在运行时,泛型类型不可用(类型擦除),因此您不能将
void travellerListed(List value)
void travellerListed(List value)
一起使用,因为这些签名在运行时是相同的。