在函数参数中键入继承

时间:2018-04-18 19:03:45

标签: function inheritance arguments julia

我遇到函数类型问题,我设法编写解释问题的最小代码:

immutable Inner{B<:Real, C<:Real}
a::B
c::C
end

immutable Outer{T}
    a::T
end

function g(a::Outer{Inner})
    println("Naaa")
end

inner = Inner(1, 1)
outer = Outer(inner)

g(outer)

会导致方法错误 MethodError: no method matching g(::Outer{Inner{Int64,Int64}}) 所以基本上,我不想说内在的类型是什么,我只是希望函数确保它是Outer{Inner}而不是Outer{Float64}或者其他什么东西

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

类型Inner{Int64,Int64}是具体的Inner类型,它不是Inner{Real, Real}的子类型,因为Inner(Int64或Float64)的不同具体类型可以在记忆中有不同的表现形式。

根据文档,函数g应定义为:

function g(a::Outer{<:Inner})
    println("Naaa")
end

因此它可以接受Inner类型的所有参数。

使用g定义<:之后的一些示例:

# -- With Float32 --

julia> innerf32 = Inner(1.0f0, 1.0f0)
Inner{Float32,Float32}(1.0f0, 1.0f0)

julia> outerf32 = Outer(innerf32)
Outer{Inner{Float32,Float32}}(Inner{Float32,Float32}(1.0f0, 1.0f0))

julia> g(outerf32)
Naaa

# -- With Float64 --

julia> innerf64 = Inner(1.0, 1.0)
Inner{Float64,Float64}(1.0, 1.0)

julia> outerf64 = Outer(innerf64)
Outer{Inner{Float64,Float64}}(Inner{Float64,Float64}(1.0, 1.0))

julia> g(outerf64)
Naaa

# -- With Int64 --

julia> inneri64 = Inner(1, 1)
Inner{Int64,Int64}(1, 1)

julia> outeri64 = Outer(inneri64)
Outer{Inner{Int64,Int64}}(Inner{Int64,Int64}(1, 1))

julia> g(outeri64)
Naaa

文档中的更多详细信息:Parametric Composite Type