2016-09-20 5 views
1

私は私が解決してきた問題が発生しますが、解決策が機能する理由doesntが私にジュリア - UTF8の行動の配列

を理にかなって、私はそれを実行しているこの1

function testB(a::Array{AbstractString}) 
    println(a) 
end 

と同様の機能を持っていました以下のようなので、私はデモのために、実際に私はAbstractString配列を持つそのImが手動で、現実にはUTF8に変換しないことを

testB(convert(Array{UTF8String},["a","b"])) 
ERROR: MethodError: `testB` has no method matching  
testB(::Array{UTF8String,1}) 

注意を与えたが、私はそれから要素をフェッチする場合、 yがUFT8

になる私のソリューションは、この方法を実行している短い

function testA{T <: AbstractString}(a::Array{T}) 
    println(a) 
end 

に読み込む種皮がTESTB doesntのに過ぎず動作しますなぜ誰も私を伝えることができ

testA(convert(Array{UTF8String},["a","b"])) 
UTF8String["a","b"] 

を与えますか? また、この{T <: SomeDataType}表記の名前はありますか? UTF8String一方

答えて

1

Array{UTF8String}ないArray{AbstractString}(NO共分散)のサブタイプである、AbstractStringのサブタイプです。したがって、あなたのtestBは機能しません。 (でも、testB(convert(Array{AbstractString},["a","b"]))がうまくいくはずです)

なぜそれがこのようにしなければならないのかについての理論的根拠:f(x::Vector{AbstractString})push!新規FooStringxとする(FooStringAbstractStringのサブタイプであると仮定する)。現在、xが実際にVector{UTF8String}だった場合、それは失敗します。