2015-04-27 53 views
4

我有延伸的B類和B類的一類的類的方法延伸的通用類錯誤覆蓋延伸通用類

我的類A是:

public class MyCustomerReviewConverter<SOURCE extends CustomerReviewModel, TARGET extends ReviewData> extends CustomerReviewConverter{ 

    @Override 
    public void populate(final SOURCE source, final TARGET target) {.....} 

擴展的類乙是

public class CustomerReviewConverter extends AbstractPopulatingConverter<CustomerReviewModel, ReviewData>{ 

    @Override 
    public void populate(final CustomerReviewModel source, final ReviewData target) 
    {..........} 

但我得到的錯誤

Name clash: The method populate(SOURCE, TARGET) of type MyCustomerReviewConverter<SOURCE,TARGET> has the same erasure as populate(CustomerReviewModel, ReviewData) of type 
    CustomerReviewConverter but does not override it 

有什麼不對?

正如填入方法的第二個參數我需要傳遞一個類

MyReviewData extends ReviewData{...} 

在此先感謝

安德烈

回答

2

棘手,難以解釋。

  1. 類型參數在通用AbstractPopulatingConverter中定義。
  2. 類型參數在CustomerReviewConverter中具體化。
  3. 然後,您嘗試在MyCustomerReviewConverter中再次使通用類型參數具有通用性。

而這只是不起作用。你試圖用一個具有不同方法簽名(不同參數類型)的方法覆蓋一個方法。

就可以覆蓋方法的唯一方法如下:

@Override 
public void populate(final CustomerReviewModel source, 
     final ReviewData target) { /* ... */ } 

然而,可替換的覆蓋的方法,你可以超載它:

public void populate(final MyCustomerReviewModel source, 
     final MyReviewData target) { /* ... */ } 

如果populate()方法在類型爲MyCustomerReviewConverter的對象上調用MyCustomerReviewModelMyReviewData參數,編譯器選擇最具體的populate方法,是超載的方法。

+1

好的,謝謝你的確認....我認爲:-) – Andrea

0

您應該延伸CustomerReviewConverter<SOURCE, TARGET>(可能是,你還沒有加入其定義到問題)而不是原始類型。那麼你需要重寫public void populate(SOURCE source, TARGET target)

+0

CustomerReviewConverter是一個非泛型類,它擴展了泛型類......它在庫中我不能修改 – Andrea

1

<SOURCE, TARGET>的通用類型的類型已經被B化爲<CustomerReviewModel, ReviewData>。 如果你想延長B,你的A應該簡單地:

public class MyCustomerReviewConverter extends CustomerReviewConverter { 
    @Override 
    public void populate(final CustomerReviewModel source, final ReviewData target) 
     { ... } 
} 

否則,你需要直接延伸AbstractPopulatingConverter,也許寫一個委託到B內進行共享邏輯,所以你可以在其他地方重複使用它。

@Robby Cornelissen在他的回答中解釋說比我好。

+1

Upvoted代表建議。 –