最近在看Thrift的代码,在TServer这个类中发现一段奇怪的代码:
public static class Args extends AbstractServerArgs {
public Args(TServerTransport transport) {
super(transport);
}
}
public static abstract class AbstractServerArgs> {
...
}
这段代码简化下来如下:
public static abstract class A> {
}
public static class B extends A {
}
还是很难理解不是吗?定义A的时候要指定继承于A的T类型,我们一般会认为A都没有定义好,又怎么能在出现在定义自己的代码中呢?
这就是泛型递归,我的看法是把这段代码看作是约定熟成的惯用法,掌握它所表现出来的特性就好。
接下来看这段代码
public static abstract class A> {
}
public static class C1 {}
public static class C2 extends A {}
public static class B1 extends A {} //这句代码会编译失败
public static class B2 extends A {}
编译失败的原因是因为T extends A要求T类型是A的子类,C1不是A的子类;而对B2的定义那句代码是编译成功的,这是因为C2是A的子类。