2012-05-17 146 views
2

我在正確實現抽象類中需要被覆蓋的泛型時遇到問題。Java抽象和泛型類型

public abstract class AbstractSerachView { 
    DataStore<AbstractCriteria, AbstractResults, AbstractService> resultsStore; 
    public abstract DataStore<AbstractCriteria, AbstractResults, AbstractService> getResultsStore(); 
} 

孩子clases如下:

public class TravelSearchView extends AbstractSearchView { 
    DataStore<TravelCriteria, TravelResults, TravelService> resultsStore; 
    public DataStore<TravelCriteria, TravelResults, TravelService> getResultsStore() { 
     return resultsStore; 
    } 
} 

這類抽象的並不在所有的工作,但將不勝感激,如果我能得到某種方式這項工作。這裏的正確方法是什麼?我對泛型類型的經驗很少。

的問題是,Eclipse的指示在子類中的錯誤:返回類型是AbstractSearchView.getResultsStore()不兼容

而且,如果我離開子類get方法與3種抽象類型,以及覆蓋用3種旅行類型變量,一切都是除了回行,其中的Eclipse表示沒關係:類型不匹配:不能從數據存儲轉換爲數據存儲

+0

'TravelSearchView'應該擴展'AbstractSearchView'嗎? – matts

+0

是的,現在確實如此。 TravelCriteria擴展了AbstractCriteria,TravelResults擴展了AbstractResults,TravelService擴展了AbstractService。 – Reivax

回答

3

這裏是你的選擇:

a)改變超類型簽名到

public DataStore<? extends AbstractCriteria, ? extends AbstractResults, ? extends AbstractService> getResultsStore(); 

B)的類型參數添加到類作爲一個整體:

abstract class AbstractSearchView< 
    C extends AbstractCriteria, 
    R extends AbstractResults, 
    S extends AbstractService> 
    public abstract DataStore<C, R, S> getResultsStore(); 
} 
class TravelSearchView extends AbstractSearchView< 
    TravelCriteria, TravelResults, TravelService> { 
    ... 
} 

問題是DataStore<TravelCriteria, TravelResults, TravelService>DataStore<AbstractCriteria, AbstractResults, AbstractService>一個亞型,即使這些泛型類型參數分別亞型。

+1

這只是一個錯字,根本不應該有空格。我沒有複製出生產代碼,而是在SO中手工編寫。 – Reivax

+0

問題是Eclipse在子類中指示錯誤:返回類型與AbstractSearchView.getResultsStore() – Reivax

+0

不兼容已更新,以迴應新問題。 –

4

如果您希望用不同的返回類型覆蓋getResultsStore(),則您的AbstractSearchView類需要爲每個參數DataStore指定通用參數。

public abstract class AbstractSearchView<C extends AbstractCriteria, R extends AbstractResults, S extends AbstractService> { 
    DataStore<AbstractCriteria, AbstractResults, AbstractService> resultsStore; 
    public abstract DataStore<AbstractCriteria, AbstractResults, AbstractService> getResultsStore(); 
} 

public class TravelSearchView extends AbstractSearchView<TravelCriteria, TravelResults, TravelService> { 
    DataStore<TravelCriteria, TravelResults, TravelService> resultsStore; 
    public DataStore<TravelCriteria, TravelResults, TravelService> getResultsStore() { 
     return resultsStore; 
    } 
} 

超型邊界(X extends SomeClass)中的AbstractSearchView參數確保了AbstractSearchView子類可以僅使用每個這些參數的亞型。

+0

優秀的,很好的答案。這將用於未來的發展。 – Reivax

4

做到這一點是讓一個基類(或接口)通用的最佳方式:

public abstract class AbstractSerachView< 
    TCriteria extends AbstractCriteria>, 
    TResults extends AbstractResults, 
    TService extends AbstractService> 
{ 
    DataStore<TCriteria, TResults, TService> resultsStore; 
    public DataStore<TCriteria, TResults, TService> getResultsStore() 
    { 
     return resultsStore; 
    } 
} 

然後在實現只是提供具體類型

public class TravelSearchView 
    extends AbstractSearchView<TravelCriteria, TravelResults, TravelService> 
{ 
} 

此外,你可以看到,實現類不需要重寫getResultsStore方法。

+0

謝謝!好的,明確的答案。這比重寫實施方法和工作要短一些。 – Reivax