Об обобщениях Scala: не удается найти манифест класса для элемента типа T - PullRequest
8 голосов
/ 13 августа 2010

Для функции, как показано ниже:

def reverse[T](a: Array[T]): Array[T] = {
    val b = new Array[T](a.length)
    for (i <- 0 until a.length)
        b(i) = a(a.length -i - 1)
    b
}

Я получаю сообщение об ошибке: не удается найти манифест класса для элемента типа T из строки 2.

Есть ли способ решить эту проблему?

Ответы [ 3 ]

10 голосов
/ 13 августа 2010

Просто добавьте привязку контекста ClassManifest к объявлению вашего метода:

def reverse[T : ClassManifest](a: Array[T]): Array[T] = ...

Чтобы создать массив, конкретный тип массива должен быть известен во время компиляции.Этот тип предоставляется компилятором через неявный параметр ClassManifest.То есть сигнатура конструктора Array на самом деле

Array[T](size: Int)(implicit m: ClassManifest[T]): Array[T]

Чтобы предоставить этот параметр, в области видимости должен быть ClassManifest, когда вызывается конструктор Array.Поэтому ваш обратный метод должен также принимать неявный параметр ClassManifest:

def reverse[T](a: Array[T])(implicit m: ClassManifest[T]): Array[T] = ...
// or equivalently
def reverse[T : ClassManifest](a: Array[T]): Array[T] = ...

Последняя, ​​более простая запись называется привязкой к контексту .

2 голосов
/ 10 мая 2013

При использовании [T: ClassManifest], если оно отображается как устаревшее, используйте [T: ClassTag]

0 голосов
/ 07 февраля 2019

При объявлении параметра Generic Type работают следующие способы:

  • (T: ClassManifest), но в scala 2.11 оно показывается устаревшим.
  • (T: Манифест)
  • (T: ClassTag), работает без ошибок и выглядит как идеальное решение, поскольку ошибка, выданная компилятором:

    не может найти тег класса для типа элемента T

package com.github.sandip.adt

import scala.reflect.ClassTag

class QueueUsingArray[T](capacity: Int) {
  var array = new Array[T](capacity)

  private var front = -1
  private var rare = -1

  def enqueue(data: T) = {
    array(rare + 1) = data
    rare += 1
  }

  def dequeue: T = {
    front += 1
    array(front)
  }

  def isEmpty() = {
    !nonEmpty
  }

  def nonEmpty: Boolean = {
    rare > front
  }

}

object Main {
  def main(args: Array[String]): Unit = {
    val queue = new QueueUsingArray[Int](10)
    queue.enqueue(10)
    queue.enqueue(20)
    while (queue.nonEmpty) {
      println(queue.dequeue)
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...