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

Kotlin代码报错咨询:两处错误修正及避错学习方向

修复你的DiscountProduct代码错误

先拆解你遇到的两个具体问题,再给出修正方案:

错误1:Kotlin: Expecting an element

这个问题出在代码的语法结构上——val discount = mutableListOf(...)和后面的override var salesPrice语句没有正确分隔,Kotlin不允许两个类成员定义紧挨着不做分隔(要么换行,要么加分号)。另外,你写的计算表达式salesPrice*(100-discount)%完全不完整:既没指定要取哪个折扣的数值,也没写完折扣计算的逻辑。

错误2:Kotlin: None of the following functions can be called with the arguments supplied

这个是类型不匹配导致的:你试图用100 - discount,但discount是MutableList<DiscountType>类型,而-运算符只能用于数值类型(比如Int、Double)。你需要从枚举常量里取出对应的折扣百分比数值才能做算术运算。

修正后的完整代码

结合“创建Product子类DiscountProduct并计算新售价”的需求,我调整了逻辑(比如允许指定要应用的折扣类型),修正后的代码如下:

// 先修正枚举类:把构造参数改成val,让外部能访问折扣数值
enum class DiscountType(val disc: Int) {
    SUMMER(20),
    SHORT(10),
    ALLAWAY(50),
    NODISC(0)
}

open class Product(
    val productName: String,
    var basePrice: Double,
    open var salesPrice: Double,
    val description: String
) {
    // 保留你原来的Product内部实现代码...
}

// 优化DiscountProduct的构造与逻辑:支持指定要应用的折扣类型
class DiscountProduct(
    productName: String,
    basePrice: Double,
    originalSalesPrice: Double,
    description: String,
    // 新增参数:指定要应用的折扣,默认无折扣
    private val appliedDiscount: DiscountType = DiscountType.NODISC
) : Product(productName, basePrice, originalSalesPrice, description) {
    // 保留可选的折扣列表(如果需要管理多个可选折扣)
    val availableDiscounts = mutableListOf(
        DiscountType.SUMMER,
        DiscountType.SHORT,
        DiscountType.ALLAWAY,
        DiscountType.NODISC
    )

    // 重写salesPrice,根据应用的折扣计算实际售价
    override var salesPrice: Double = basePrice * (100 - appliedDiscount.disc) / 100.0
}

核心修正点说明

  1. 枚举类修复:把DiscountType(disc:Int)改成DiscountType(val disc: Int),这样才能访问每个枚举常量对应的折扣数值(原来的disc只是构造参数,外部无法读取)。
  2. 语法结构修复:将成员变量availableDiscounts和重写的salesPrice分开,确保语法符合Kotlin规范。
  3. 计算逻辑修复:用basePrice乘以(100 - 折扣百分比)/100得到折扣后价格,同时通过appliedDiscount.disc获取枚举的数值,解决类型不匹配问题。
  4. 构造优化:新增appliedDiscount参数,让你可以灵活指定要应用的折扣,更贴合实际业务场景。

避免同类错误需要学习的主题

  • Kotlin语法基础:重点掌握类成员定义规则、枚举类的构造与属性访问、运算符的类型匹配限制。
  • 面向对象继承:理解子类重写父类属性的规则,以及子类构造函数如何向父类传递参数。
  • 类型系统认知:明确不同数据类型(集合、枚举、数值)之间的操作边界,避免跨类型的无效运算。
  • 表达式完整性:确保所有计算表达式逻辑完整,避免出现无意义的语法片段。

内容的提问来源于stack exchange,提问作者user12595983

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:32:49