关于
abstract class B<T extends B<T>>
class A extends B<A>
的用法?
该用法用在链式调用中有继承关系时,示例如下:
链式调用
案例
单个类中链式调用非常常见,比如StringBuffer
中的append
方法
StringBuffer sb = new StringBuffer();
sb.append("精通")
.append("java")
.append("只需要CV")
.append("即可");
单类链式案例
-
链式调用单类写法,返回当前对象即可
class Cat { public Cat eat() { System.out.println("吃东西"); return this; } public Cat sleep() { System.out.println("准备睡觉"); return this; } }
-
调用测试
public class Client { public static void main(String[] args) { Cat cat = new Cat(); //链式调用 cat.eat().sleep(); } } } //输出结果 吃东西 准备睡觉
继承下的链式调用
- 继承下的链式调用将发生异常
class Animal { public Animal run() { System.out.println("奔跑"); return this; } } class Cat extends Animal{ public Cat eat() { System.out.println("吃东西"); return this; } public Cat sleep() { System.out.println("准备睡觉"); return this; } }
- 客户端调用,出现编译错误
public static void main(String[] args) { Cat cat = new Cat(); //此处.sleep出现编译错误 //原因是调用run后返回的是父类Animal类型,此时无法调用子类扩展的sleep方法 cat.eat().run().sleep(); }
引入泛型解决
- 加入泛型
<T extends Animal<T>>
class Animal<T extends Animal<T>> { public T run() { System.out.println("奔跑"); return (T)this; } } class Cat extends Animal<Cat>{ public Cat eat() { System.out.println("吃东西"); return this; } public Cat sleep() { System.out.println("准备睡觉"); return this; } }
改变后客户端泛型将不再出错