比方說,我有這樣的功能(這只是一個例子,所以不要給我更好的方法來創建0,1,2,...風格數組):斯卡拉:奇怪的類型不匹配錯誤
def createArray(size: Int): Array[Int] = {
for (i <- 0 until size) yield i
}
但是,編譯生氣與一些神祕的類型不匹配錯誤:
(fragment of compare-images.scala):39: error: type mismatch;
found : RandomAccessSeq.Projection[Int]
required: Array[Int]
for (i <- 0 until size) yield i
^
one error found
!!!
discarding <script preamble>
我敢肯定,原因有事可做的事實,until
方法的返回類型爲Range
,不Array
。然而,爲什麼編譯器不能只投射這些類型呢? 有趣的問題消失了,當我刪除我的函數的返回類型:
def createArray(size: Int) = {
for (i <- 0 until size) yield i
}
但我想我的函數返回Array
...
我也有另一種功能,它是這樣的:
def screateArray2: Array[Int] = {
val a = Array(1,2,3,4,5)
for (i <- a) yield i
}
它編譯沒有任何問題。它產生的值非常類似於第一個例子,但直到方法才使用...
我是否錯過了有關Scala的類型系統?
我對Scala很陌生。
編輯:我有點解決我的問題是這樣的:
def crop(data: Array[Int]): Array[Int] = (
for (i <- 0 until data.size) yield i
).toArray
但在我看來,這是什麼,但可讀......
我應該說之前你不需要值「推斷「(或者Scala編譯器用來匹配類型)而不是」cast「。 – 2010-07-25 09:08:10
但是類型不匹配,因爲Range不是Array的子類型,所以在這裏沒有推斷正確結果類型的問題。你必須做一個轉換來獲得。 – 2010-07-25 09:40:59
是的,但你真的不必是一個天才編譯器來自動將Range轉換爲Array,而不是打擾類型不匹配錯誤:) – 2010-07-25 18:32:27