[英]Java Generics Type Erasure Method Signature Problem
給定以下假設的類型層次結構:
BaseElement
+ StringElement
+ ....
+ ....
+ BooleanElement
+ ....
+ ....
+ ...
我有一個 class 接口,格式如下:
IBaseElementService createElementService(Class<? extends BaseElement> element);
IBooleanElementService createElementService(Class<? extends BooleanElement> element);
這在 eclipse 3.4 中編譯得很好,但在 eclipse 3.6 中不再編譯,失敗並出現錯誤:
Method ... has the same erasure createElementService(Class<T>) as another method in this type
我有點困惑為什么它在 eclipse 3.4 下編譯,因為 java 編譯器刪除了該類型。 但無論如何,有沒有一種優雅的方法可以在不重命名方法的情況下改變它?
謝謝!
編輯:正如多人指出的那樣,這似乎是一個 eclipse 3.4 - 3.5 錯誤。 eclipse 錯誤報告(感謝 denis.solonenko 提供鏈接!)
如果有人對此錯誤的技術細節感興趣,請務必閱讀 Paŭlo Ebermann 的帖子,謝謝!
重命名了方法。 (但是為什么你有兩種方法?也許第一種應該是唯一的公共方法;它可以檢查 class 類型並轉發到 BooleanElement 的第二種方法)
根據當前的語言規范,您的兩種方法應該可以編譯。 看這里。 我聽說在 Java 7 這樣的 2 方法不能再共存了。 不確定其中的原理。
您可以向IBaseElementService
添加泛型。
在 creaseElementService 內部,您需要進行一些檢查以返回正確的元素服務。
IBaseElementService<T> createElementService(Class<T extends BaseElement> elementClass) {
if (elementClass.equals(BooleanElement.class))
return new IBooleanElementService();
return new IBaseElementService();
}
public class IBooleanElementService implements IBaseElementService<BooleanElement> { ... }
public class IBaseElementService implements IBaseElementService<BaseElement> { ... }
在 VM 級別上,方法簽名也包括返回類型。 因此,您的兩個方法具有簽名createElementService(Class):IBooleanElementService
和createElementService(Class):IBaseElementService
。 只要編譯器知道調用哪個方法,它就可以將調用放到字節碼中正確的方法。 我認為這就是 Eclipse 3.4 所做的。
在 Java 語言級別上,方法僅通過名稱和參數類型來區分。 在這里,您的方法具有簽名createElementService(Class<? extends BooleanElement>)
和createElementService(Class<? extends BaseElement>)
。 但是語言規范說它們將被刪除的泛型類型 - 它們都被刪除到createElementService(Class)
,現在它們根本沒有什么不同,這是不允許的。
我認為 3.4 編譯器在這里有一個錯誤(即它編譯的語言不是真正的 Java)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.