2016-09-20 156 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},那就會失敗。