Я немного прочитал о Manifests и методах избегания стирания, необходимых, чтобы позволить Scala делать что-то вроде «нового массива [Array [T]]», но я немного озадачен этим ...Scala параметризация моего массива принимает строку?
У меня есть метод, похожий на таблицу, состоящую из нескольких строк в массиве, таком как электронная таблица. Например представить 2D массив так:
11, 5, 4
8, 3, 7
2, 1, 4
Я написал метод, который суммирует столбцы этого массива и выплевывает 1D массив, как [21, 9, 15]
Я хочу genericize это больше, чем просто инты (например, Doubles или Floats), и когда я добавляю параметр и манифест, я получаю ошибку компиляции.
Вот код
def sumGrid[T](grid: Array[Array[T]])(implicit m: ClassManifest[T]): Array[T] = {
val sum = new Array[T](grid(0).size)
for(i <- 0 until grid.size) {
for(j <- 0 until grid(0).size) {
sum(j) = sum(j) + grid(i)(j)
}
}
sum
}
Вот ошибка компиляции:
[ERROR] ...scala/euler/GridOperations.scala:126: error: type mismatch;
[INFO] found : T
[INFO] required: String
[INFO] sum(j) = sum(j) + grid(i)(j)
[INFO] ^
[ERROR] one error found
Что здесь происходит? Почему String «требуется»?
Обратите внимание, что в этом случае вы можете обойти этот вопрос, написав определение функции sumGrid [T: Числовые] (сетка: Array [Array [T]]) = grid.transpose.map (. _ Сумма) '. –