class SelfBounded<T extends SelfBounded<T>>
作者说道:
这就像两面镜子彼此照向对方所引起的目眩效果一样,是一种无限反射。
SelfBounded
类接受泛型参数T,
而T
由一个边界限定,这个边界就是拥有T作为其参数的SelfBounded
理解:
首先是范型类A,有个范型参数T,范型参数T有边界限定,边界限定就是有参数T的范型类A
class SelfBounded<T extends SelfBounded<T>> {}
class A extends SelfBounded<A> {}//正常
class B extends SelfBounded<A> {}//正常
// compile error:Type parameter 'B' is not within its bound; should extend SelfBounded<B>'
// 编译器提示:因为 class B extends SelfBounded<A> 不满足条件:T extends SelfBounded<T>
// 如何才能满足条件呢?将类B的定义改为class B extends SelfBounded<B>,
class D extends SelfBounded<B> {}//编译错误
两种方式使class D
编译通过
class B extends SelfBounded<B>
SelfBounded
的定义修改为:class SelfBounded<T extends SelfBounded>
class BasicHolder<T> {
T element;
void set(T arg) { element = arg; }
T get() { return element; }
void f() {
System.out.println(element.getClass().getSimpleName());
}
}
class Subtype extends BasicHolder<Subtype> {}
public class CRGWithBasicHolder {
public static void main(String[] args) {
Subtype st1 = new Subtype(), st2 = new Subtype(), st3 = new Subtype();
st1.set(st2);
st2.set(st3);
Subtype st4 = st1.get().get();
st1.f();
}
}
Subtype
用法:一个普通的泛型类我们可以继承它来做到自限定
class SelfBounded<T extends SelfBounded<T>> {//自限定类型的标准用法
//所有
T element;
SelfBounded<T> set(T arg) {
element = arg;
return this;
}
T get() { return element; }
}
class A extends SelfBounded<A> {}
public class SelfBounding {
public static void main(String[] args) {
A a = new A();//a变量只能与A类型变量交互,这就是自限定的妙处
SelfBounded<A> b = new SelfBounded<A>();
}
} ///:~
自限定类的用途为保证 子类对基类型成员函数的重写
4.1、基本类导致不能覆盖父类函数
public class Basic{
Basic b;
public void set(Basic b){ this.b = b; }
public static void main(String[] args) {
SubType st = new SubType();
st.set(new SubType()); //正常,调用了SubType类本身的set函数
st.set(new Basic()); //正常,调用了继承自Basic的set函数
}
}
class SubType extends Basic{
SubType b;
//SubType类还隐式继承了Basic的set函数,没有被重写的set函数覆盖
public void set(SubType b){ this.b = b; }
}
4.2、自限定类保证函数重写
public class Basic<T extends Basic<T>>{
T b;
public void set(T b){ this.b = b; }
public static void main(String[] args) {
SubType st = new SubType();
st.set(new SubType()); //正常
st.set(new Basic()); //编译报错,调用了继承自Basic的set函数,并且限制类行为SubType
}
}
class SubType extends Basic<SubType>{}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/mingyuli/article/details/120453549
内容来源于网络,如有侵权,请联系作者删除!