2012-05-17 145 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