1

我試圖使用泛型實現Strategy + Factory模式。我們的目標是返回一個客戶端類的接口DocumentDao的實現,它可以處理類型T extends Document,所以我有多個Dao接口爲DocumentDao的不同子類型擴展DocumentDao。Java - 帶泛型的工廠和戰略模式

這裏是我的代碼:

public class Document { ... } 

public class DocumentA extends Document { ... } 

public class DocumentB extends Document { ... } 

public interface DocumentDao<T extends Document> { 
    public void update(T document); 
} 

public interface DocumentADao<DocumentA> {} 

public interface DocumentDaoFactory { 
    public <T extends Document> DocumentDao<T> getDaoInstance(Class<T> clazz); 
} 

然後我嘗試使用工廠:

private <T extends Document> void someMethod(T document) { 
    ... 
    DocumentDao<T> documentDao = this.documentDaoFactory.getDaoInstance(document.getClass()); 
    documentDao.update(document); 
    ... 
} 

但有關getDaoInstance()調用編譯器的抱怨:

Type mismatch: cannot convert from DocumentDao<? extends AbstractGDriveDocument<?>> to DocumentDao<T> 

如何處理這種情況? 我如何獲得類似的解決方案?

由於

回答

4

的問題是,getClass是返回Class<?>,這是適當的API;它不知道具體哪個具體的Class實例帶回來。此外,您的類型綁定在您的方法中不正確且無效。

爲了解決這個問題,你需要改變兩兩件事:

  • 在你DocumentDaoFactory方法,改變必然是適當的。

    <T extends Document> DocumentDao<T> getDaoInstance(Class<T> clazz); 
    
  • 在你使用的getDaoInstance,執行未經檢查的強制轉換爲Class<T>

    DocumentDao<T> documentDao = this.documentDaoFactory.getDaoInstance((Class<T>) document.getClass()); 
    

你的類型是綁定應該給你回你所關心的情況下,沒有得到任何運行時錯誤的方式。

+0

對不起,第一個錯誤,這只是一個疏忽(在我的真實代碼中是正確的),所以我會更新這個問題。 第二點解決了我的問題,非常感謝。 – user1781028