2

我在需要重写的抽象类中正确实现泛型时遇到问题。

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()不兼容

此外,如果我将子类 get 方法保留为 3 种抽象类型,并使用 3 种旅行类型覆盖变量,则一切正常,除了返回行,其中 Eclipse 指示:类型不匹配:无法从 DataStore 转换为 DataStore

4

3 回答 3

4

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

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

于 2012-05-17T15:53:08.993 回答
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方法。

于 2012-05-17T15:55:03.987 回答
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>,即使这些泛型类型参数分别是子类型。

于 2012-05-17T15:42:49.237 回答