有人可以解释以下相当复杂的递归通用模板用法吗?

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(即ESEntity)参数化的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

坦白地说,递归泛型通常是通往太聪明的道路。它们可能很有用,但是很多时候它们只是“精巧”的,人们试图将问题转向聪明的地方,而不是相反。

09-04 08:26