我具有以下类层次结构:
public interface Table<V> {
Map<String, Object> getNamedParams(SearchQuery<V> query);
}
public class TopicTable implements Table<Topic> {
@Override
public Map<String, Object> getNamedParams(TopicSearchQuery query) {
// TODO to be implemented
return null;
}
}
@Data
public abstract class SearchQuery<E> {
private Integer pageSize;
private Integer pageNumber;
}
public class TopicSearchQuery extends SearchQuery<Topic> {
private String orgId;
private Boolean isShared;
private String name;
private String description;
}
我的IDE抱怨接口getNamedParams
中的方法Table
在类TopicTable
中未正确实现。我知道它与继承和我对泛型的使用有关。
我要完成的工作:将实体,搜索查询和表绑定在一起,以便该表仅对适当的实体和搜索查询起作用。我希望它具有凝聚力和强大性。关于如何最好地实现它的任何想法,以使设计不会混乱或麻烦,理想情况下,无需显式转换。
提前致谢。
答案 0 :(得分:2)
此方法签名:
getNamedParams(TopicSearchQuery query)
不覆盖该方法。必须是:
getNamedParams(SearchQuery<Topic> query)
您不能将参数的类型更改为比接口要求更具体(因为这会违反Liskov的可替代性)或不太具体(因为Java在覆盖时不允许使用)。
如果您希望能够需要更具体的参数类型,请添加另一个类型变量:
public interface Table<V, SQ extends SearchQuery<V>> {
Map<String, Object> getNamedParams(SQ query);
}
然后,您可以声明实现类以使用该类型:
public class TopicTable implements Table<Topic, TopicSearchQuery> {
@Override
public Map<String, Object> getNamedParams(TopicSearchQuery query)