继承情况下链式调用的异常处理

简介: 关于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();
}

引入泛型解决

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;
    }
}
目录
相关文章
|
8月前
嵌套调用和链式访问
嵌套调用和链式访问
56 0
|
8月前
|
Java
多态如何影响接口方法的调用
多态如何影响接口方法的调用
42 2
|
8月前
|
定位技术 API C++
单例,函数的三种调用方式
单例,函数的三种调用方式
48 0
|
8月前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
226 1
|
前端开发
8 # 链式调用
8 # 链式调用
48 0
|
算法 Java 编译器
如何理解对象赋值给接口的操作(关键在对象!)
如何理解对象赋值给接口的操作(关键在对象!)
如何理解对象赋值给接口的操作(关键在对象!)
|
C++
同样一句代码,在类内调用,跟类外调用结果不同?
同样一句代码,在类内调用,跟类外调用结果不同?
82 0
为什么不通过修改接口或者选择书写继承接口重写方法的新子类,偏偏选择添加上一个装饰器
为什么不通过修改接口或者选择书写继承接口的新子类,偏偏选择添加上一个装饰器?
138 0
为什么不通过修改接口或者选择书写继承接口重写方法的新子类,偏偏选择添加上一个装饰器
|
Java 编译器
Java方法02——方法的调用与重载
Java方法02——方法的调用与重载
115 0
Java方法02——方法的调用与重载
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
293 0
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )