java - 有人能解释一下参数在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
给 be的泛型类型Excerpt
。所以你不能改变参数,因此不允许添加一个。
总结一下:public class ExcerptDAO implements ExcerptsDAO { ... }
很好,因为ExcerptsDAO
总是只 处理Excerpt
实例。
如果您这样做ExcerptsDAO<T extends Excerpt> implements DAO<T>
,它会起作用,但是您必须始终为 for 定义一个泛型类型参数,ExcerptsDAO
因为它也可能是Excerpt
.
推荐阅读
- amazon-web-services - 我正在尝试使用 JMeter 在 myserver 中加载测试。我使用 Groovy 创建了脚本并尝试在 JMeter 上运行它,但它给出了内部服务器错误
- amazon-web-services - 创建 EC2 实例时如何设置默认标签?
- reactjs - ReactJS 中的事件
- apache-kafka - 使用 Apache Atlas 与 Kafka 相关的查询
- c++11 - Linux 上的 GCC 在错误的命名空间中搜索前向声明的方法
- json - 在 JSON 模式中设置枚举值
- python - 多处理比python中的线程慢
- reactjs - create-react-app 上的错误“rollbackFailedOptional”
- .net - IIS 上的 Web API 显示连接被拒绝
- python - 如何在 Cython 中使用字典,在 nogil 函数中