[英]Overloading of methods in Java
在以下代碼段中,有一個名為show()
的方法的三個版本。
package overloading;
import java.util.ArrayList;
import java.util.List;
public final class Main
{
private void show(Object object)
{
System.out.println("Object");
}
private void show(List<Object> list) //Unused method
{
System.out.println("List");
}
private void show(Object[] objects)
{
System.out.println("Objects");
}
private void addToList()
{
List<String>list=new ArrayList<String>();
list.add("String1");
list.add("String2");
list.add("String3");
show(list); // Invokes the first version
String []s={"111", "222", "333"};
show(s); // Invokes the last version
}
public static void main(String[] args)
{
new Main().addToList();
}
}
在這個最簡單的Java代碼中,這個方法調用show(s);
( addToList()
方法中的最后一行)調用重載方法的最后一個版本 。 它提供了一個字符串數組 - String[]
,它被Object[]
類型的接收參數接受。
這個函數調用show(list);
但是嘗試調用重載方法的第一個版本 。 它傳遞一個類型字符串List<String>
- List<String>
,它應該被接收參數類型為List<Object>
的中間版本接受。方法的中間版本是完全未使用的。 如果刪除了第一個版本,則是編譯時錯誤。
為什么這個電話show(list);
不調用此版本 - private void show(List<Object> list){}
- 中間版本?
簡而言之, List<Object>
不是List<String>
。
要“修復”您的代碼,請使用以下代碼
private void show(List<? extends Object> list)
{
System.out.println("List");
}
與數組(在Java中是協變的)不同,泛型類型的不同實例化彼此不兼容,甚至不是顯式的。
聲明Generic<Supertype> superGeneric; Generic<Subtype> subGeneric;
Generic<Supertype> superGeneric; Generic<Subtype> subGeneric;
編譯器將報告兩個(Generic<Subtype>)superGeneric
和(Generic<Supertype>)subGeneric
(Generic<Subtype>)superGeneric
的轉換錯誤。
如果通配符可以軟化這種不兼容性?
用作實際類型參數: Generic<?>
是泛型類型的所有實例化的抽象超類型。
另見
List<Object>
不是java中List<String>
的超類。 您所假設的是Java在泛型上具有協方差,但它沒有。
這意味着如果A
是B
的超類, List<A>
不是List<B>
的超類
在無法將泛型轉換為擴展嵌套類型時遇到了類似的問題,您可以看看是否有適合您的工作。
或許改變
private void show(List<Object> list)
至
private void show(List<? extends Object> list)
會像你期望的那樣工作嗎?
我會說這是因為參數不同, List <Object>
與List <String>
List <Object>
不同因此當你調用重載方法時,默認為第一個只接受一個Object。
這是一個簡短的例子:
public class Test
{
public static void overload (Object o)
{
System.out.println ("Object");
}
public static void overload (List <Object> o)
{
System.out.println ("List Object");
}
public static void main (String [] args)
{
overload (new ArrayList <Object>()); //"List Object"
overload (new ArrayList <String>()); //"Object"
}
}
使用泛型參數化列表,一切都應該有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.