Java 接口泛型,其中实现类定义类型

时间:2021-07-01 02:10:51

标签: java

我正在尝试为一个库设计一些接口,以支持其数据的多个存储系统 - 如 mysql 或 mongo。

我正在尝试设计一个单一的 Model 界面,以便使用我的 API 的任何人都可以看到哪些数据可用。问题在于 ID 或主键类型不同。例如,从 mysql 它将是一个 Long 并且 mongo 使用 ObjectId 等。

我想我可以用泛型来处理这个问题,但我不确定这是正确的方法。我不想一直强制转换以获得正确的 ID 类型。

这是一种可以接受的方法还是我应该使用其他方法?我不想用这种方法构建我的 API,然后遇到问题而不得不重做。

狗模型界面:

public interface DogModel<T> {
    T getId();
}

特定于sql的狗模型:

public class SqlDogModel implements DogModel<Long> {
    private final Long id;

    public SqlDogModel(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }
}

我如何在通用存储接口中声明模型:

public interface StorageAdapter {
    Optional<DogModel> getDog(String name);
}

1 个答案:

答案 0 :(得分:1)

它可以变得更简单: 抽象类可以实现接口,但在我的示例中,我在基类中有 getter 和 setter 逻辑,这不能在接口中发生,因为接口没有逻辑。

public abstract class DogModel < T > {
T id;
public T getId() {
    return id;
}
public void setId(T id) {
    this.id = id;
}}

public class SqlDogModel extends DogModel < Long > {}