我遇到了在需要覆盖的抽象类中正确实现泛型的问题。
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转换为数据存储
答案 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>
的子类型,即使这些泛型类型参数分别是子类型。