我在哪裏試圖創建兩個靜態重載方法我有一個編譯錯誤。誰能解釋一下這個靜態方法重載與泛型
public class A {
public static void a(Set<String> stringSet) {}
public static void a(Set<Map<String,String>> mapSet) {}
}
我在哪裏試圖創建兩個靜態重載方法我有一個編譯錯誤。誰能解釋一下這個靜態方法重載與泛型
public class A {
public static void a(Set<String> stringSet) {}
public static void a(Set<Map<String,String>> mapSet) {}
}
原因是type erasure。泛型沒有存儲在類中,它們只是編譯時信息,所以在運行時,這兩種方法是相同的,因此存在命名衝突。
參考
這三種方法實際上是相同的(讀:它們產生相同的字節碼):
public static void a(Set plainSet) {}
public static void a(Set<String> stringSet) {}
public static void a(Set<Map<String,String>> mapSet) {}
如果您確實需要兩種獨立的方法,您必須提供不同的方法簽名(例如,不同的方法名稱,方法之一的附加參數等)
方法解析是在編譯時完成的,因此可以擴展Java語言以允許這種重載而無需具體化。但是,堅持更好的方法命名可能更簡單。 – 2010-10-06 02:29:00
是的,但目標是不打破二進制格式(舊代碼必須繼續工作,即使使用新代碼) – 2010-10-06 04:49:05
從方法角度來看,參數Set<String>
和Set<Map<String,String>>
是相同的,因爲泛型類的所有實例都具有相同的運行時類(在你的情況下設置),而不管它們的實際類型參數。因此你會得到一個erasure error
。此外,在運行時都將看起來像...... public static void a(Set stringSet) {}
和 public static void a(Set mapSet) {}
你有編譯器錯誤,因爲方法不正確超載。兩種方法都有Set類型的參數,這兩個方法使得編譯器的方法都是相同的。
什麼是錯誤? – kasten 2010-10-05 06:22:43