有人可以解释参数在 java 层次结构中的工作原理吗?

Can somebody explain how parameters work in java hierarchy?

我是 java 继承的新手,很难理解概念的细节。在我的 Springboot 项目中,我最初有 2 个域 classes:

public class Excerpt {
    private int excerptID;
    private String author;
    private String title;
    private String text;
    private String comments;
}

public class Tag {
    private int excerptID;
    private String description;
}

DAO 包由通用 DAO 接口组成

public interface DAO<T> {

    public void save(int id, String... params);
    public List<T> getAll();
    public List<T> getByTitle(String... params);
    public List<T> getByTag(String... params);
    public List<T> getByID(int excerptID);
    public int countAll();
    public void delete(int id);
}

和 2 class 实施

public class ExcerptDAO implements DAO<Excerpt> { ... }

public class TagDAO implements DAO<Tag> { ... }

到目前为止一切顺利。但后来我决定添加另一个域 class Outline,它将与 Excerpt

共享 Tag 数据库 table
public class Outline {
    private int outlineID;
    private String title;
    private String plot;
    private String comments;
    private String genre;
    private String resources;
}

而且 DAO 方法会部分重叠,所以我添加了另一层接口。保护伞DAO接口:

public interface DAO<T> {

    public void save(int id, String... params);
    public List<T> getAll();
    public List<T> getByTitle(String... params);
    public List<T> getByTag(String... params);
    public List<T> getByID(int id);
    public int countAll();
    public void delete(int id);
}

ExcertpsDAO 和 OutlinesDAO 扩展接口

public interface ExcerptsDAO extends DAO<Excerpt>{
    public List<Excerpt> getByAuthor(String... params);
}

public interface OutlinesDAO extends DAO<Outline> {
    public List<Outline> getByGenre(String... params);
    public List<Outline> getByResource(String... params);
}

我正准备将它们实施到 classes 中,但不理解我遇到的错误:

public class ExcerptDAO implements ExcerptsDAO<Excerpt> { ... }

The type ExcerptsDAO is not generic; it cannot be parameterized with arguments <Excerpt>

显然这是正确的

public class ExcerptDAO implements ExcerptsDAO { ... }

但是我不明白为什么当参数和ExcerptsDAO接口一样时不被接受。如果参数相同,为什么接口不是通用的呢?

您试图为 ExcerptsDAO 声明一个通用参数,但它没有。但是 DAO 有一个通用参数(参见 DAO<T> 中的 T)。仅当您想要 class,嗯,更通用时才需要泛型。

例如如果你想创建一个 ExcerptsDAO,不仅仅是你的 Excerpts,而是其他 classes(在这种情况下当然没有意义),你可以创建一个通用参数。

public interface ExcerptsDAO<T> extends DAO<T>{
    public List<T> getByAuthor(String... params);
}

我认为在这种情况下您不需要泛型。

如果 class 或接口不接受通用参数,则不允许添加一些,就像不允许将参数传递给接受 none 的方法一样。所以 ExcerptsDAO has_no_ 泛型参数并且已经将传递给 DAO 的泛型类型修复为 Excerpt。所以你不能更改参数,因此不允许添加一个。

总而言之:public class ExcerptDAO implements ExcerptsDAO { ... } 非常好,因为 ExcerptsDAO 总是 只处理 Excerpt 个实例。

如果你做 ExcerptsDAO<T extends Excerpt> implements DAO<T> 它会工作但是你必须总是为 ExcerptsDAO 定义一个泛型类型参数,因为它也可能是 [=12= 以外的东西].

我的你需要像这样改变一点

change : 

ExcerptsDAO extends DAO<Excerpt>
to
ExcerptsDAO<T> extends DAO<T>

ExcerptsDAO implements ExcerptsDAO<Excerpt>

或者你也可以这样做

public class ExcerptDAO implements ExcerptsDAO{}