Многомерные массивы Scala еще раз - PullRequest
3 голосов
/ 31 августа 2011
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]"? Почему channelNumber передает, а framesNumber, который также является целым числом, не имеет значения?

Ответы [ 2 ]

5 голосов
/ 31 августа 2011

Теперь вы вызываете метод ofDim [T] (n1: Int)(implicit arg0: ClassManifest[T]), который вам не нужен. Измените вызов на Array.ofDim[Int](channelsNumber,framesNumber), и будет вызван метод ofDim [T] (n1: Int, n2: Int)(implicit arg0: ClassManifest[T]). Вы хотите оставить группу неявных параметров неявной.

И - манифест класса - это способ сохранить информацию о типе в универсальных классах.

4 голосов
/ 31 августа 2011

Сначала ваша ошибка: ofDim берет все измерения в одном списке параметров. Вам нужно

Array.ofDim[Int](channelsNumber, framesNumber)

Второй, ClassManifest. Из-за стирания типа и того факта, что в JVM массивы очень похожи на универсальные, но не являются универсальными (помимо прочего, без стирания типов), универсальному методу ofDim необходимо передать тип элементов. Это ClassManifest, который близок к передаче класса в java (вы должны сделать то же самое в java - или передать пустой массив соответствующего типа, в Collection.toArray - если у вас есть универсальный метод, который должен возвращать массив ) Это аргументы implicit, то есть есть другой список параметров с этим аргументом, но компилятор scala попытается заполнить его автоматически, без необходимости записывать его в коде. Но если вы дадите второй список параметров, это означает, что вы намереваетесь передать ClassManifest самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...