方法重载时重复的方法

以下代码提供编译错误,错误“重复方法”

static int test(int i){ return 1; } static String test(int i){ return "abc"; } 

这是预期的,因为重载方法具有相同的签名并且仅在返回类型方面不同。

但是下面的代码编译好了警告:

 static int test1(List l){ return 1; } static String test1(List l){ return "abc"; } 

因为,我们知道Java Generics在Erasure上运行,这意味着在字节码中,这两种方法具有完全相同的签名,并且与返回类型不同。

更令我惊讶的是,以下代码再次出现编译错误:

 static int test1(List l){ return 1; } static String test1(List l){ return "abc"; } 

如果有重复的方法,第二个代码如何正常工作而不会给出任何编译错误?

解析重载方法是在编译时完成的,而不是运行时,因此Java编译器会知道第二个示例中两者之间的区别。 在第三个示例中,问题是List也是一个List ,因此如果传入List ,它将不知道使用哪一个。

  1. 如果参数相同,Java无法确定使用哪一个。 因此,它会引发重复的方法错误。
  2. String ListInteger List不能直接对话,因此方法不同。 没错。
  3. Integer List也可以用作任何东西的普通List ,因此如果提供了一个Integer List – >重复方法错误,Java无法确定使用哪一个。

第一个结果是预期和正确的。

现在让我们谈谈第二个

让我们尝试调用这些函数。

 List intList; List strList; test1(intList) test1(strList) 

编译器将调用各自的方法。

现在3号

 List intList; List unknownList; test1(intList); test1(unknownList); 

哇!! 编译器现在应该调用哪个方法!! ‘因为unknowList可以是Integers List 。 希望能帮助到你。

方法重载的基本更改:PARAMETER必须不同。 在您的情况下,两个方法test始终使用相同的参数。 其次返回类型可能会也可能不会改变。请先尝试这个例子。

 static int test(int i){ return 1; } static String test(List l){ return "abc"; } 

您的第二个示例有效,因为两个ListList是两个不同的参数。

第三个示例失败,因为List of Integer也可以用作List.A代码运行后如果List整数作为参数传递,Java将无法确定应该调用哪两个函数。