自定义内部构造方法报错:无匹配Pris(::Float64,::Float64,::Float64)方法
问题分析与解决
报错原因
在Julia中,当你为结构体定义自定义构造函数时,系统自动生成的「内联构造函数」(即能直接匹配结构体字段类型的默认构造)会被覆盖。你的代码仅定义了两个构造:
- 无参构造
Pris() - 接受三个
Integer类型参数的构造Pris(l::Integer,w::Integer,h::Integer)
而2.4、1.4这类浮点数属于Float64类型(是Real的子类型,但不是Integer),调用Pris(2.4,1.4,4.6)时,没有匹配的构造方法,因此触发MethodError。
Julia不会自动“忽略参数类型不匹配直接创建实例”,它严格遵循方法匹配规则,只有存在对应参数类型的构造函数时才会执行。
解决方案
只需修改构造函数的参数类型为Real,让它能适配所有Real的子类型(包括Integer、Float64等),同时保留你的验证逻辑:
struct Pris length::Real width::Real height::Real function Pris() new(1,0,1) end # 将参数类型从Integer改为Real function Pris(l::Real,w::Real,h::Real) if l<0 || w<0 || h<0 error("Cannot have negative values") elseif w<l error("Cannot have shorter width than length") else new(l,w,h) end end end
测试验证
- 传入浮点数时,会执行验证逻辑:
z = Pris(2.4,1.4,4.6) # 触发错误:w=1.4 < l=2.4,提示"Cannot have shorter width than length" - 符合条件的浮点数可以正常创建实例:
z = Pris(2.4,3.4,4.6) # 成功生成Pris实例 - 整数参数依然可以正常使用:
z = Pris(2,3,4) # 成功生成Pris实例
内容的提问来源于stack exchange,提问作者uzairphd
相关产品推荐
相关产品推荐

