问题描述
我是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{}