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 }
核心修正点说明
- 枚举类修复:把
DiscountType(disc:Int)改成DiscountType(val disc: Int),这样才能访问每个枚举常量对应的折扣数值(原来的disc只是构造参数,外部无法读取)。 - 语法结构修复:将成员变量
availableDiscounts和重写的salesPrice分开,确保语法符合Kotlin规范。 - 计算逻辑修复:用
basePrice乘以(100 - 折扣百分比)/100得到折扣后价格,同时通过appliedDiscount.disc获取枚举的数值,解决类型不匹配问题。 - 构造优化:新增
appliedDiscount参数,让你可以灵活指定要应用的折扣,更贴合实际业务场景。
避免同类错误需要学习的主题
- Kotlin语法基础:重点掌握类成员定义规则、枚举类的构造与属性访问、运算符的类型匹配限制。
- 面向对象继承:理解子类重写父类属性的规则,以及子类构造函数如何向父类传递参数。
- 类型系统认知:明确不同数据类型(集合、枚举、数值)之间的操作边界,避免跨类型的无效运算。
- 表达式完整性:确保所有计算表达式逻辑完整,避免出现无意义的语法片段。
内容的提问来源于stack exchange,提问作者user12595983
相关产品推荐
相关产品推荐

