今天来学习一种看似令人费解的泛型用法:public class SelfBounded<T extends SelfBounded<T>>,这被称为泛型的自限定类型。
泛型参数 T 还得继承 SelfBounded<T>,相信你第一次看到时,估计也会和我一样:一脸懵逼。
这究竟有什么用处呢?我们先来看个简单的例子。
public class BasicHolder<T> {
T element;
public T getElement() {
return element;
}
public void setElement(T element) {
this.element = element;
}
}
public class Subtype extends BasicHolder<Subtype> {}
public class SubtypeChild extends Subtype {}
public class CRGWithBasicHolder {
public static void main(String[] args) {
new Subtype().setElement(new Subtype());
new Subtype().setElement(new SubtypeChild());
}
}
Subtype 继承自 BasicHolder,并将自身作为 BasicHolder 的类型参数。这样可限定其类型参数必须为其导出类,这种方式被称为 循环模板模式(CRG)。
接下来,我们再来看看泛型的自限定类型,它将泛型将自己作为边界参数来使用,保证类型参数与正在被定义的类相同。
public class SelfBounded<T extends SelfBounded<T>>{}
public class A extends SelfBounded<A> {}
public class B extends SelfBounded<A> {}
public class C extends SelfBounded<C> {}
public class D {}
//此类无法通过编译
// public class E extends SelfBounded<D> {}
public class F extends SelfBounded {}
上述例子中 ,类 A 将自己定义为 SelfBounded 的类型参数,正常通过编译。类 B 的类型参数为 A,因 A 将自身作为了 A 类中的类型参数,故也可通过编译。
由此可以得出,<T extends SelfBounded<T>> 中,T 可以为将自身定义为 SelfBounded 的类,也可以是实现了 SelfBounded<T> 的类。
故 类 E 想将类 D 作为 SelfBounded 的类型参数是无法通过编译的。
但值得注意的是,类 F 是可以通过编译的,所以自限定类型并不是强制执行的。
本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。
若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!