我以为我很了解Java泛型,但后来我在java.lang.Enum中遇到了以下内容:
class Enum<E extends Enum<E>>
Run Code Online (Sandbox Code Playgroud)
有人可以解释如何解释这个类型参数?用于提供可以使用类似类型参数的其他示例的加分点.
我在某处看到了这种模式:
class A extends B<A> {
}
Run Code Online (Sandbox Code Playgroud)
通过将新类型指定为泛型的实际类型,此结构对于扩展泛型有点不寻常.有什么用?这个模式有名字吗?有没有替代模式?
示例:https://code.google.com/p/selenium/wiki/LoadableComponent
跳到: public class EditIssue extends LoadableComponent<EditIssue> {
编辑:阅读完回复后,我似乎需要改变编译器对类型检查的理解.在我的脑海里,我的牛肉有这种模式,如果两个A需要相同,那么有没有办法不重复它们?但似乎没有更好的方法将派生类的类型传播给父类.
abstract class AbstractFoo<SELF extends AbstractFoo<SELF>> implements Comparable<SELF> {
@Override
public final int compareTo(final SELF o) {
// ...
}
}
final class C1 extends AbstractFoo<C1> {
// ...
}
final class C2 extends AbstractFoo<C2> {
// ...
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码(Comparable
为了清楚起见选择了界面;当然还有其他用例),我可以轻松地比较两个实例C1
:
new C1().compareTo(new C1());
Run Code Online (Sandbox Code Playgroud)
但不是AbstractFoo
具体类型不同的后代:
new C1().compareTo(new C2()); // compilation error
Run Code Online (Sandbox Code Playgroud)
但是,滥用模式很容易:
final class C3 extends AbstractFoo<C1> {
// ...
}
// ...
new C3().compareTo(new C1()); // compiles cleanly …
Run Code Online (Sandbox Code Playgroud)