我遇到了一个我已经解决的问题,但为什么解决方案的工作原理对我没有意义
我有一个类似于这个的功能
function testB(a::Array{AbstractString})
println(a)
end
像这样运行它给了我
testB(convert(Array{UTF8String},["a","b"]))
ERROR: MethodError: `testB` has no method matching
testB(::Array{UTF8String,1})
注意我实际上并没有手动转换为UTF8,它用于演示,实际上我有一个AbstractString数组,但是当我从中获取元素时,它们就变成了UFT8
我的解决方案简而言之
function testA{T <: AbstractString}(a::Array{T})
println(a)
end
运行此方法
testA(convert(Array{UTF8String},["a","b"]))
UTF8String["a","b"]
任何人都可以告诉我为什么testA有效,但testB没有?
此外,这个{T <: SomeDataType}
符号是否有名称?
答案 0 :(得分:1)
虽然UTF8String
是AbstractString
的子类型,但Array{UTF8String}
不是Array{AbstractString}
的子类型(无协方差)。因此你的testB不起作用。 (但testB(convert(Array{AbstractString},["a","b"]))
应该有用。)
为什么它必须是这样的基本原理:函数f(x::Vector{AbstractString})
可以例如push!
新FooString
x
{假设FooString
是AbstractString
的子类型。现在,如果x
实际上是Vector{UTF8String}
,则会失败。