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

简介: 关于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;
    }
}
目录
相关文章
|
3月前
嵌套调用和链式访问
嵌套调用和链式访问
28 0
|
3月前
|
Java
多态如何影响接口方法的调用
多态如何影响接口方法的调用
23 2
|
10月前
|
前端开发
8 # 链式调用
8 # 链式调用
33 0
|
人工智能 算法 IDE
你的代码太啰嗦了 | 这么多方法调用?
本篇通过 Kotlin 独有 约定(运算符重载) 来简化方法的调用。
76 0
为什么不通过修改接口或者选择书写继承接口重写方法的新子类,偏偏选择添加上一个装饰器
为什么不通过修改接口或者选择书写继承接口的新子类,偏偏选择添加上一个装饰器?
124 0
为什么不通过修改接口或者选择书写继承接口重写方法的新子类,偏偏选择添加上一个装饰器
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
265 0
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
|
Java 开发者
反射调用普通方法|学习笔记
快速学习反射调用普通方法
107 0
反射调用普通方法|学习笔记
面向对象——方法的调用
面向对象——方法的调用
172 0
java反射构建对象和方法的反射调用
java反射构建对象和方法的反射调用Java反射技术应用广泛,其能够配置:类的全限定名,方法和参数,完成对象的初始化,设置是反射某些方法。可以增强java的可配置性。 1.1 通过反射构建对象(无参数):   例如我们使用 ReflectServiceImpl 类讲解这个例子 1 public class ReflectServiceImpl {2 public void sayHello(String name){3 System.out.println("hello"+name);4 }5 }我们通过反射的方法去构建它。
856 0