2010-10-05 139 views
8

我在哪裏試圖創建兩個靜態重載方法我有一個編譯錯誤。誰能解釋一下這個靜態方法重載與泛型

public class A { 
public static void a(Set<String> stringSet) {} 
public static void a(Set<Map<String,String>> mapSet) {} 
} 
+0

什麼是錯誤? – kasten 2010-10-05 06:22:43

回答

14

原因是type erasure。泛型沒有存儲在類中,它們只是編譯時信息,所以在運行時,這兩種方法是相同的,因此存在命名衝突。

參考

這三種方法實際上是相同的(讀:它們產生相同的字節碼):

public static void a(Set plainSet) {} 
public static void a(Set<String> stringSet) {} 
public static void a(Set<Map<String,String>> mapSet) {} 

如果您確實需要兩種獨立的方法,您必須提供不同的方法簽名(例如,不同的方法名稱,方法之一的附加參數等)

+0

方法解析是在編譯時完成的,因此可以擴展Java語言以允許這種重載而無需具體化。但是,堅持更好的方法命名可能更簡單。 – 2010-10-06 02:29:00

+0

是的,但目標是不打破二進制格式(舊代碼必須繼續工作,即使使用新代碼) – 2010-10-06 04:49:05

1

從方法角度來看,參數Set<String>Set<Map<String,String>>是相同的,因爲泛型類的所有實例都具有相同的運行時類(在你的情況下設置),而不管它們的實際類型參數。因此你會得到一個erasure error。此外,在運行時都將看起來像...... public static void a(Set stringSet) {}public static void a(Set mapSet) {}

0

你有編譯器錯誤,因爲方法不正確超載。兩種方法都有Set類型的參數,這兩個方法使得編譯器的方法都是相同的。