有人能帮我理解为什么这个 julia 函数定义与我在下面看到的使用它的尝试不匹配吗?
我的天真假设是传递给函数的 Array{ASCIIString,1}
应该与 Array{AbstractString,1}
的函数定义匹配,并且以此类推。
julia> function test(a::Array{AbstractString,1}, b::AbstractString, c::Any) end
test (generic function with 1 method)
julia> test([""],"","")
ERROR: MethodError: `test` has no method matching test(::Array{ASCIIString,1}, ::ASCIIString, ::ASCIIString)
Closest candidates are:
test(::Array{AbstractString,1}, ::AbstractString, ::Any)
julia>
最佳答案
我认为将我上面的两条评论变成答案是值得的。
正如@DanGetz 所指出的,这里的重要短语是invariant。在这种特殊情况下,这个原则意味着 ASCIIString <: AbstractString
计算结果为 true
, 但是 Array{ASCIIString, 1} <: Array{AbstractString, 1}
计算结果为 false
.因此,要使您的问题中定义的函数起作用,您需要传入一个数组 a
与 eltype(a)
评估为 AbstractString
.传入a
与 eltype(a)
评估为 ASCIIString
不起作用,因为这不是 Array{AbstractString, 1}
的子类型.
要解决您的问题,您需要类型参数。如果您只想为类型为 b
的情况定义函数匹配 eltype(a)
,那么您将使用:
function test{T<:AbstractString}(a::Array{T}, b::T, c::Any)
如果你想允许 b
的类型不同于eltype(a)
, 但强制执行 b
成为 AbstractString
的子类型,你会使用:
function test{T<:AbstractString}(a::Array{T}, b::AbstractString, c::Any)
关于Julia 多次调度与子类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37357942/