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

简介: 关于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;
    }
}
目录
相关文章
|
9月前
嵌套调用和链式访问
嵌套调用和链式访问
63 0
|
9月前
|
前端开发
Promise链式调用与错误处理
Promise链式调用是处理异步操作的方式,它按顺序执行多个任务,每个任务返回Promise对象。通过`.then()`指定成功后的操作,`.catch()`处理错误。示例代码展示了如何使用fetch获取数据,根据状态码解析响应并处理数据,错误则通过`.catch()`捕获。另一个例子定义了三个异步函数构成Promise链,依次执行并处理结果,错误同样由`.catch()`统一管理。
|
8月前
|
安全 Java
JAVA反射调用方法
JAVA反射调用方法
|
9月前
|
定位技术 API C++
单例,函数的三种调用方式
单例,函数的三种调用方式
52 0
|
9月前
|
前端开发 JavaScript
Promise的链式调用案例讲解
Promise的链式调用案例讲解
|
前端开发
8 # 链式调用
8 # 链式调用
53 0
|
人工智能 算法 IDE
你的代码太啰嗦了 | 这么多方法调用?
本篇通过 Kotlin 独有 约定(运算符重载) 来简化方法的调用。
110 0
|
C++
同样一句代码,在类内调用,跟类外调用结果不同?
同样一句代码,在类内调用,跟类外调用结果不同?
85 0
为什么不通过修改接口或者选择书写继承接口重写方法的新子类,偏偏选择添加上一个装饰器
为什么不通过修改接口或者选择书写继承接口的新子类,偏偏选择添加上一个装饰器?
143 0
为什么不通过修改接口或者选择书写继承接口重写方法的新子类,偏偏选择添加上一个装饰器