2016-09-20 106 views
1

我遇到我已经解决的问题,但为什么解决方案的工作没有道理给我朱莉娅 - 的UTF8行为阵列

我不得不运行它类似于此

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"] 

谁能告诉我,为什么种皮的作品,但TESTB犯规? 另外,是否有这个{T <: SomeDataType}表示法的名称?

回答

1

虽然UTF8StringAbstractString一个亚型,Array{UTF8String}是不Array{AbstractString}(无协方差)的子类型。因此你的testB不起作用。 (但是testB(convert(Array{AbstractString},["a","b"]))应该可以工作。)

理由为什么它必须是这样的:函数f(x::Vector{AbstractString})可以例如push!新的FooString分成x(假设FooStringAbstractString的子类型)。现在如果x实际上是Vector{UTF8String},那就会失败。