有人可以解释以下相当复杂的递归通用模板用法吗?
public abstract class Data<E extends Data<E, S>,
S extends Writer<E>> extends Entity<E,S>
如上所述,在使用递归泛型时我们应该记住什么。以及这两种类型(这里是 E 和 S )之间的关系和规则如何?
如果有的话,请提供一些有关这种通用用法的资源/链接/书籍。
我知道一本关于这方面的书,《有效的Java》,由Joshua Bloch(项目27)编辑
最佳答案
Data
有两个参数,E
最终必须是其自身的实例,S
必须能够对其进行实例化(更具体地说,是Writer
指定的相同类型的实例)。最后,E
也符合通过相同Data<E,S>
和Entity
(即E
是S
和Entity
)参数化的Data<E,S>
的资格/继承能力。
一个具体的实现可能看起来像Writer<E>
,其中NumericalData extends Data<NumericalData, NumWriter>
实现/扩展了NumWriter
,并且Writer<NumericalData>
也符合NumericalData
的资格。
编辑:
为什么要这样?可能需要在抽象类中定义依赖于满足条件Entity<NumericalData, NumWriter>
的参数/返回值的泛型方法,但也希望能够使用更显式的类型返回/工作。例如,在Data<E,S>
中,可能有
E doSomething(E toThis) { toThis.aDataClassMethod(); return toThis; }
该类可以进行第一个调用,因为它知道
Data<E,S>
是E
,并返回更具体的类型,因为它知道Data<E,S>
是toThis
。坦白地说,递归泛型通常是通往太聪明的道路。它们可能很有用,但是很多时候它们只是“精巧”的,人们试图将问题转向聪明的地方,而不是相反。