Java中如何调用父类数组内实现接口的子类实例的接口方法
问题原因
你使用的数组类型为Account[],从数组中取出元素时,编译器会默认将元素识别为Account父类类型。由于Account类本身没有定义deductTax()方法,也没有实现TaxDeduction接口,因此直接调用该方法会触发编译报错。
你可以正常调用的CurrentAccount类方法,本质是Account类中已经定义、CurrentAccount子类重写的方法,父类引用可以直接调用这类方法,运行时会自动绑定到子类的实现逻辑。
解决方案
在调用deductTax()方法前,先对取出的元素做类型校验,确认是实现了TaxDeduction接口的实例后,向下转型再调用对应方法即可,代码示例如下:
Account[] accounts = // 你的Account数组实例 for (Account acc : accounts) { // 写法1:Java 16及以上版本支持模式匹配,无需手动强转 if (acc instanceof TaxDeduction taxableAcc) { taxableAcc.deductTax(); } // 写法2:Java 16以下版本兼容写法 /* if (acc instanceof TaxDeduction) { TaxDeduction taxableAcc = (TaxDeduction) acc; taxableAcc.deductTax(); } */ }
如果你需要对所有Account子类都提供扣税相关的定义,也可以选择在Account父类中添加抽象的deductTax()方法,无需强制转型即可调用,但不需要扣税的子类(如SavingsAccount)需要实现空的方法逻辑,该方案灵活性较低,仅适合所有子类都需要实现扣税逻辑的场景。
内容的提问来源于stack exchange,提问作者Mohsin Zubair
相关产品推荐
相关产品推荐

