函数参数类型继承问题:Julia中Outer{Inner}方法匹配失败
解决Julia中嵌套参数化类型的方法匹配问题
这个问题在Julia的参数化类型处理里很常见,我来帮你理清楚原因和解决办法:
问题根源
你定义的Inner{B<:Real, C<:Real}是一个参数化具体类型,Inner本身是一个类型构造器(或者说UnionAll类型,代表所有Inner{B,C}的集合),而Inner{Int64,Int64}才是一个具体的实例类型。
你原来的函数声明:
function g(a::Outer{Inner}) println("Naaa") end
实际上要求传入的Outer实例,其类型参数必须是Inner这个构造器本身(比如Outer(Inner)这样的实例),而不是任何Inner{B,C}的实例。这就是为什么你传入Outer(Inner(1,1))(类型是Outer{Inner{Int64,Int64}})会触发方法错误的原因。
解决方案
我们需要让函数g接受任意实例化的Inner类型作为Outer的参数,有两种简洁的写法:
写法1:使用where子句显式参数化
function g(a::Outer{T}) where T<:Inner println("Naaa") end
这里的where T<:Inner表示T可以是Inner的任何子类型(也就是所有Inner{B,C}的实例类型),这样就能匹配所有包裹着Inner实例的Outer对象。
写法2:使用更简洁的<:语法
Julia支持在类型注解中直接使用<:来限定子类型,效果和上面完全一致:
function g(a::Outer{<:Inner}) println("Naaa") end
验证修改后的代码
把你的代码修改后运行就能正常工作了:
immutable Inner{B<:Real, C<:Real} a::B c::C end immutable Outer{T} a::T end # 使用第二种简洁写法的函数g function g(a::Outer{<:Inner}) println("Naaa") end inner = Inner(1, 1) outer = Outer(inner) g(outer) # 现在会输出"Naaa",不再报错
内容的提问来源于stack exchange,提问作者Dominus
相关产品推荐
相关产品推荐

