Java抽象和通用类型

时间:2012-05-17 15:40:46

标签: java generics abstraction

我遇到了在需要覆盖的抽象类中正确实现泛型的问题。

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

孩子的责任如下:

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

这种抽象根本不起作用,尽管如果我能以某种方式获得这项工作,我将不胜感激。这里的正确方法是什么?我对泛型类型的经验很少。

问题是Eclipse在子类中指示错误:返回类型与AbstractSearchView.getResultsStore()不兼容

此外,如果我使用3个抽象类型保留子类get方法,并使用3个旅行类型覆盖变量,除了返回行之外,一切都没问题,其中Eclipse表示:类型不匹配:无法从DataStore转换为数据存储

3 个答案:

答案 0 :(得分:4)

如果您想要使用不同的返回类型覆盖AbstractSearchView,则DataStore类需要为getResultsStore()的每个参数指定通用参数。

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的子类只能使用每个参数的子类型。

答案 1 :(得分: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方法。

答案 2 :(得分: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>的子类型,即使这些泛型类型参数分别是子类型。