有人可以解释参数在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界面中的参数相同时为什么不接受该参数。如果参数相同,为什么接口不是通用的呢?

解决方法

如果类或接口不使用通用参数,则不允许您添加一些参数,就像您不允许将参数传递给不带任何参数的方法一样。因此,ExcerptsDAO 具有has_no_泛型参数,并且已经将传递给DAO的泛型类型固定为Excerpt。因此,您无法更改参数,因此不允许添加该参数。

总结:public class ExcerptDAO implements ExcerptsDAO { ... }很好,因为ExcerptsDAO始终仅处理Excerpt个实例。

如果您可以使用ExcerptsDAO<T extends Excerpt> implements DAO<T>,那么它会起作用,但是您必须始终为ExcerptsDAO定义一个泛型类型参数,因为它可能不是Excerpt的东西。

,

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

例如如果您不仅想创建ExcerptsDAO,还想创建其他类(对于这种情况,这当然是没有意义的),可以创建一个通用参数。

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

在这种情况下,我认为您不需要通用。

,

我需要这样更改

change : 

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

ExcerptsDAO implements ExcerptsDAO<Excerpt>

或者您也可以这样做

public class ExcerptDAO implements ExcerptsDAO{}