- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一组扩展一些基本实体的类。该集合中的类也可以相互扩展,创建嵌套层次结构。
我的目标是让所有类都可以访问创建自身新实例的方法。我想在我的基本实体中实现这个方法,以便所有扩展类都继承它。
下面是为我的模式定义的三个示例类:
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/
我是一名优秀的程序员,十分优秀!