Data
有两个参数,E
它们最终必须是它自己的一个实例,并且S
它必须能够成为Writer
它自己的一个实例(更具体地说,是由 指定的同一种自身实例E
)。最后,Data<E,S>
还限定为/继承Entity
由相同E
和参数化的能力S
(即,Entity
属于Data<E,S>
和Writer<E>
)。
具体的实现可能看起来像
NumericalData extends Data<NumericalData, NumWriter>
whereNumWriter
实现/扩展Writer<NumericalData>
并且NumericalData
也有资格作为Entity<NumericalData, NumWriter>
.
编辑:
为什么要做这样的事情?有人可能希望在抽象类中定义依赖于参数/返回满足条件的泛型方法Data<E,S>
,但也希望能够返回/使用更明确的类型。例如,在 中Data<E,S>
,可能有
E doSomething(E toThis) { toThis.aDataClassMethod(); return toThis; }
该类可以进行第一次调用,因为它知道E
是 a Data<E,S>
,并返回更具体的类型,因为它知道toThis
是 a E
。
老实说,递归泛型通常是过于聪明的道路。它们可能很有用,但很多时候它们只是“整洁”,人们试图将问题转向一些聪明的东西,而不是反过来。