有人可以解释参数在 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{}
我是 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{}