层次模型问题中的泛型

时间:2019-08-13 16:12:21

标签: java generics

我具有以下类层次结构:

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中未正确实现。我知道它与继承和我对泛型的使用有关。 我要完成的工作:将实体,搜索查询和表绑定在一起,以便该表仅对适当的实体和搜索查询起作用。我希望它具有凝聚力和强大性。关于如何最好地实现它的任何想法,以使设计不会混乱或麻烦,理想情况下,无需显式转换。 提前致谢。

1 个答案:

答案 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)