gpt4 book ai didi

Java:嵌套递归泛型

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:27 26 4
gpt4 key购买 nike

我有一组扩展一些基本实体的类。该集合中的类也可以相互扩展,创建嵌套层次结构。

我的目标是让所有类都可以访问创建自身新实例的方法。我想在我的基本实体中实现这个方法,以便所有扩展类都继承它。

下面是为我的模式定义的三个示例类:

BaseEntity.java

public abstract class BaseEntity<E extends BaseEntity> {

Class<E> clazz;

public BaseEntity(Class<E> clazz) {
this.clazz = clazz;
}

public E getNewInstance() throws IllegalAccessException, InstantiationException {
return clazz.newInstance();
}

}

Collection.java

public class Collection<E extends Collection> extends BaseEntity<E> {

public Collection() {
super(Collection.class);
// compiler error: BaseEntity (java.lang.Class<E>) in BaseEntity cannot be applied to
// (java.lang.Class<Collection>)
}

public Collection(Class<E> clazz) {
super(clazz);
}

}

文档.java

public class Document extends Collection<Document> {

public Document() {
super(Document.class);
}

}

有了这个设置,我希望能够做这样的事情:

Collection c = new Collection();
c = c.getNewInstance(); // compiler error

Document d = new Document();
d = d.getNewInstance();

Collection cd = new Document();
cd = cd.getNewInstance(); // compiler error

但是请注意,Collection.java 的默认构造函数中存在编译器错误。我不确定为什么会导致这种情况,我认为这也会导致示例 main 方法中的编译器错误。我做错了什么,我该如何解决?

请注意,这是一个与我试图解决的更大问题有关的人为示例。我知道这个实现本身看起来很傻。

最佳答案

Collection<E...>是泛型,但是你的 Collection c是原始类型。这意味着它的所有方法都将被视为原始类型,这意味着它们将返回那里的任何泛型的删除。

您的基类声明为 BaseEntity<E extends BaseEntity> ,这意味着在这个方法中:

E getNewInstance()

删除是

BaseEntity getNewInstance();

这意味着c.getNewInstance()返回 BaseEntity , 不是 Collection ,这是您的编译错误出现的地方。

Document另一方面,不是泛型类。这意味着删除在编译时并不重要(出于这些目的),并且 getNewInstance()返回类型 E代表,在本例中为 Document .因此,d.getNewInstance()返回类型为 Document ,因此该行可以正常编译。


顺便说一句:每当你有递归泛型时,你应该确保在递归中考虑泛型。例如,在这一行中:

BaseEntity<E extends BaseEntity>

你已经定义了BaseEntity作为一个泛型类——但随后立即忽略了它在 E extends BaseEntity 中的泛型.该行应该改为:

BaseEntity<E extends BaseEntity<E>>

关于Java:嵌套递归泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28180036/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com