首页 > 解决方案 > 有人能解释一下参数在java层次结构中是如何工作的吗?

问题描述

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

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 类实现

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

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

到目前为止,一切都很好。但后来我决定添加另一个域类Outline,它将与共享Tag数据库表Excerpt

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);
}

我即将将它们实现到类中,但不明白我得到的错误:

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接口中的参数相同时不接受。如果参数相同,为什么接口不是通用的呢?

标签: javaspring-bootparametershierarchy

解决方案


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

总结一下:public class ExcerptDAO implements ExcerptsDAO { ... }很好,因为ExcerptsDAO总是 处理Excerpt实例。

如果您这样做ExcerptsDAO<T extends Excerpt> implements DAO<T>,它会起作用,但是您必须始终为 for 定义一个泛型类型参数,ExcerptsDAO因为它也可能是Excerpt.


推荐阅读