man*_*nta 5 java generics recursion templating
有人可以解释下面的,相当复杂的递归通用模板用法吗?
public abstract class Data<E extends Data<E, S>,
S extends Writer<E>> extends Entity<E,S>
Run Code Online (Sandbox Code Playgroud)
在使用递归泛型时我们应该记住什么,如上所述.这些类型之间的关系和规则如何,这里是E&S?
如果有的话,请提供一些有关此类通用用法的资源/链接/书籍.我知道有一本书谈论这个,有效的Java,Joshua Bloch的第二版(议题27)
Data有两个参数,E它们最终必须是其自身的实例,并且S必须能够是Writer其自身的实例(更具体地说,是由 指定的同一类型的自身实例E)。最后,Data<E,S>还限定为/继承Entity由相同的Eand参数化的功能S(即Entityis ofData<E,S>和Writer<E>)。
具体的实现可能类似于
NumericalData extends Data<NumericalData, NumWriter>其中NumWriter实现/扩展Writer<NumericalData>并且NumericalData也有资格作为Entity<NumericalData, NumWriter>.
编辑:
为什么要做这样的事情?人们可能希望在抽象类中定义通用方法,这些方法依赖于满足条件的参数/返回Data<E,S>,但也希望能够返回/使用更明确的类型。例如,在 中Data<E,S>,可能有
E doSomething(E toThis) { toThis.aDataClassMethod(); return toThis; }
Run Code Online (Sandbox Code Playgroud)
该类可以进行第一次调用,因为它知道E是 a Data<E,S>,并返回更具体的类型,因为它知道toThis是 a E。
老实说,递归泛型通常是通往聪明之路。它们可能很有用,但很多时候它们只是“简洁”,人们试图通过一些巧妙的方法来解决问题,而不是反之亦然。