在下面的代碼片段中,有一個名爲show()
的方法的三個版本。Java中方法的重載
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<Object>
這些方法的中間版本完全沒有使用。如果第一個版本被刪除,這是一個編譯時錯誤。
爲什麼這個電話show(list);
不調用此版本 - private void show(List<Object> list){}
- 中間的一個?
+1。有趣。顯然,編譯器會考慮泛型類型註釋,並消除本來會選擇的重載方法。我會期望編譯錯誤,因爲泛型類型不匹配。如果你從'list'中刪除類型註釋(使它成爲'List list'),那麼中間方法就會被選中(當然會有警告和運行時錯誤)。 – Thilo
當帶有'list'的泛型類型參數被刪除時選擇中間版本。 – Tiny
從Java 5開始,隨着自動裝箱,可變參數和泛型的使用,方法調度變得非常複雜。這使得考試問題變得很好(或者至少是棘手)。 – Thilo