为何无法在ArrayList中调用getFixed方法?如何解决该问题?
为啥ArrayList里调不了getFixed?看这几个解决办法!
嘿,我来帮你捋清楚这个问题!你遇到的报错本质是Java的编译时类型检查在搞事情:
- 你的
ArrayList声明的是ArrayList<TypeExpences>,所以当你用listOfTypes.get(0)拿对象时,编译器会把这个对象当成TypeExpences类型来处理。 - 如果
TypeExpences类里压根没定义getFixed()方法,编译器肯定会报错——它只认变量声明的类型,不管实际存的是Water子类对象。
下面给你几个实用的修复方案,你可以根据自己的类结构选:
方案1:给父类加getFixed方法(最推荐)
如果TypeExpences是所有费用类型的基类,那最合理的做法是在TypeExpences里定义getFixed()方法——可以是带默认实现的普通方法,要是想强制子类自己实现,就做成抽象方法也行:
public class TypeExpences { // 你的其他属性和方法 public int getFixed() { // 这里可以写默认返回值,或者改成抽象方法(把类也改成abstract) return 0; } } // 记得让UseExpences继承TypeExpences哦! public class UseExpences extends TypeExpences { private int fixed; // 构造方法 public UseExpences(int kod, String descr, int fixed, String unit, int pricePer) { this.fixed = fixed; // 其他初始化逻辑 } // 重写getFixed,返回实际的fixed值 @Override public int getFixed() { return this.fixed; } } // Water继承UseExpences,自然就能用getFixed方法了 public class Water extends UseExpences { int pricePer2; public Water(int kod, String descr, int fixed, String unit, int pricePer, int pricePer2) { super(kod, descr, fixed, unit, pricePer); this.pricePer2 = pricePer2; } }
改完之后,listOfTypes.get(0).getFixed()就能正常跑了——编译器知道TypeExpences有这个方法,实际执行时会调用子类的重写版本。
方案2:改ArrayList的泛型类型
要是TypeExpences不需要包含getFixed()方法,那直接把ArrayList的泛型改成UseExpences就行(毕竟Water是UseExpences的子类,而getFixed()应该是在UseExpences里定义的):
// 把泛型从TypeExpences换成UseExpences ArrayList<UseExpences> listOfTypes = new ArrayList<UseExpences>(); Water waterExp = new Water(0, "fafasd", 10, "cubic meters", 2, 1); listOfTypes.add(waterExp); // 现在get(0)返回的是UseExpences类型,直接调getFixed就行 System.out.println(listOfTypes.get(0).getFixed());
这个方式简单直接,但有个小局限:这个ArrayList以后只能存UseExpences和它的子类,没法存其他TypeExpences的子类(如果有的话)。
方案3:强制类型转换(应急用)
要是你不想改父类也不想改泛型,那可以在调用方法前把对象强转成Water或者UseExpences类型:
// 强转成Water类型 System.out.println(((Water)listOfTypes.get(0)).getFixed()); // 或者转成UseExpences(如果getFixed是在UseExpences里定义的) System.out.println(((UseExpences)listOfTypes.get(0)).getFixed());
⚠️ 注意:这个方法有风险!如果ArrayList里存的不是Water/UseExpences类型的对象,运行时会炸ClassCastException,所以只适合你百分百确定对象类型的情况。
内容的提问来源于stack exchange,提问作者Thodoris Ydraios
相关产品推荐
相关产品推荐

