6

在Scala中2.11.2,下面的小例子在Array[String]使用類型歸屬當只編譯:Scala的類型推斷:不能推斷IndexedSeq [T]從Array [T]

object Foo {  

    def fromList(list: List[String]): Foo = new Foo(list.toArray : Array[String]) 

} 

class Foo(source: IndexedSeq[String])  

如果我刪除fromList類型歸屬,它會失敗,出現以下錯誤編譯:

Error:(48, 56) polymorphic expression cannot be instantiated to expected type; 
found : [B >: String]Array[B] 
required: IndexedSeq[String] 
    def fromList(list: List[String]): Foo = new Foo(list.toArray) 
                ^

爲什麼不能編譯器推斷Array[String]這裏?還是這個問題必須做一些從Array's到IndexedSeq的隱式轉換?

+1

注意我認爲你可以這樣做:'對象foo {高清fromlist裏(名單:名單[字符串]):美孚=新的Foo(list.toArray [字符串] )}'而不是。 – david 2014-10-31 15:38:24

+0

或者只是'list.toIndexedSeq',當然。不過,這個問題依然很好。 – 2014-10-31 15:41:03

+0

謝謝你指出。我爲'Array's而不是'IndexedSeq'尋找原因純粹是出於性能原因。我不得不剖析這個函數,發現'Vector'在創建大量小實例時需要更多的開銷。 – Chris 2014-10-31 15:48:07

回答

4

問題是.toArray方法返回一些B類型的數組,它是List[T]中的T的超類。這允許您在List[Bar]上使用list.toArray,其中Array[Foo]是必需的,如果Bar延伸Foo

是的,這並不是開箱即用的真正原因是編譯器試圖找出使用哪個B以及如何到達IndexedSeq。似乎它試圖解決IndexedSeq[String]要求,但B只能保證是StringString的超類;因此錯誤。

這是我的首選解決方法:

def fromList(list: List[String]): Foo = new Foo(list.toArray[String])