簡體   English   中英

Java Generics 類型擦除方法簽名問題

[英]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):IBooleanElementServicecreateElementService(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM