You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:35:36