2011-08-31 55 views
3
var channelsNumber = track.getNumberOfChannels() 
var framesNumber = lastFrame - firstFrame 
var frames = Array.ofDim[Int](channelsNumber)(framesNumber) 
System.out.println(frames.length); 
System.out.println(frames.length); 

我嘗試定義整數的二維數組。我得到這個錯誤:斯卡拉多維陣列一次

[error] .../test.scala:58: type mismatch; 
[error] found : Int 
[error] required: scala.reflect.ClassManifest[Int] 
[error]  var frames = Array.ofDim[Int](channelsNumber)(framesNumber) 
[error]             ^
[error] one error found 

什麼是「scala.reflect.ClassManifest [Int]」?爲什麼channelsNumber傳遞和framesNumber,這也是一個整數不?

回答

5

現在,您正在調用您不想要的方法ofDim [T] (n1: Int)(implicit arg0: ClassManifest[T])。將呼叫更改爲Array.ofDim[Int](channelsNumber,framesNumber),並調用方法ofDim [T] (n1: Int, n2: Int)(implicit arg0: ClassManifest[T])。您想要隱式隱式參數組。

而 - 類清單是如何保留泛型類中的類型信息的一種方法。

+0

謝謝!奇怪的是,它與Array.ofDim [Int](4)(4)正常工作,但它沒有與變量。 – ciembor

+2

當我在repl中運行代碼'Array.ofDim [Int](4)(4)'時,我得到了同樣的錯誤'type mismatch' ... – coubeatczech

4

首先出現錯誤:ofDim將所有維納入單個參數列表中。您需要

Array.ofDim[Int](channelsNumber, framesNumber) 

二,ClassManifest。由於類型擦除以及事實而非JVM,數組非常類似於泛型,但不是泛型的(除其他外,不包括類型擦除),通用方法ofDim需要傳遞元素的類型。這就是ClassManifest,它接近於在java中傳遞一個類(你必須在java中做同樣的事情 - 或者在Collection.toArray中傳遞一個適當類型的空數組,如果你有一個泛型方法必須返回一個數組)這是作爲一個implicit參數,也就是說有另一個帶有這個參數的參數列表,但scala編譯器會嘗試自動填充它,而不必將它寫入代碼中。但如果你給出第二個參數列表,這意味着你打算自己通過ClassManifest