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。
老实说,递归泛型通常是过于聪明的道路。它们可能很有用,但很多时候它们只是“整洁”,人们试图将问题转向一些聪明的东西,而不是反过来。