进阶:泛型-recursive type parameter
Enum<E extends Enum<E>> 的解释
例如定义如下抽象类,然后实现类就只能是 X extends Enum<X> 的模式,如下
public abstract class Enum<E extends Enum<E>> {
}
public Color extends Enum<Color> {
}
// 这样定义也可以满足这个模式,只要Tmp满足 Enum<E extends Enum<E>> 里的 E extends Enum<E> 就可以了。假如将Tmp全部换成Color2的话就是上面Color类那样的声明模式
class Tmp extends Enum<Tmp> {
}
class Color2 extends Enum<Tmp> {
}
这样限定子类Color定义的模式的意思是:
- Color想要继承Enum类下的方法(Color extends)
- 而且Color里的方法里会使用到或者返回Color类型(即系在方法中回返回自己类型的对象)
如何实现的?
Enum<E extends Enum<E>>里的类型参数,即 E extends Enum<E> 限定了类型参数必须是Enum<E> 的子类,即以类自己为类型参数实例化的Enum的子类。能满足这个要求的类只能是满足类模式 X extends Enum<X> 的类X,这样就可以将要继承 Enum<E extends Enum<E>> 的子类的类型参数限定为子类自己,例如,Color extends Enum<Color> 就将Enum的类型限定为Color自己了。
最终的解释
To sum it up, the declaration " Enum<E extends Enum<E>> " can be decyphered as: Enum is a generic type that can only be instantiated for its subtypes, and those subtypes will inherit some useful methods, some of which take subtype specific arguments (or otherwise depend on the subtype).
上面的第一句:
the declaration " Enum<E extends Enum<E>> " can be decyphered as: Enum is a generic type that can only be instantiated for its subtypes(要自己的子类才可以实例化自己)
可以用如下代码解释
class Tmp extends Enum<Tmp> {
}
class Color2 extends Enum<Tmp> {
}
第二句:
and those subtypes will inherit some useful methods, some of which take subtype specific arguments (or otherwise depend on the subtype).
因为需要使用到子类自己本身作为某些方法的类型参数所以要将以上的两个类合二为一,即如下
class Color2 extends Enum<Color2> {
}
这样就可以既满足第一句,也满足了第一句的话,只需要类Tmp,然后Tmp作为Enum的类型参数被Color2继承。但是满足第二句的话,就需要Tmp是Color2,这样class Tmp extends Enum<Tmp>的声明就变成了class Color2 extends Enum<Color2>,刚好和上面的定义一模一样,可以合二为一,所以叫“递归类型参数”:Enum<Color2>里的Color2需要继承Enum<Color2>这样的限制,当找Color2的声明的时候,刚好Color2自己本身的声明就满足这样的要求。
所以这样的声明本身就包含了两层意思,满足
class Color2 extends Enum<Color2> {}
解释:
http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ106