Подтвердить что ты не робот

Scala: "Никакого манифеста, доступного для типа T"

Я работаю над проектом Lift со смешанным кодом Scala и Java.

На стороне Java у меня есть следующие релевантные элементы:

interface IEntity

interface IDAO<T extends IEntity> {
    void persist(T t);
}

На стороне Scala у меня есть следующее:

abstract class Binding[T <: IEntity] extends NgModel {
    def unbind: T
}

class BasicService[E <: IEntity](serviceName: String, dataAccessObject: IDAO[E]) {
      def render = renderIfNotAlreadyDefined(
        angular.module("myapp.services")
          .factory(serviceName,
            jsObjFactory()
              .jsonCall("persist", (binding: Binding[E]) => {  //<---COMPILATION ERROR
                  try {
                    dataAccessObject.persist(binding.unbind)
                    Empty
                   } catch {
                   case e: Exception => Failure(e.getMessage)
                   }
              })
          )
     )
}

Этот код не будет компилироваться. Я получаю следующую ошибку в указанной выше точке:

No Manifest available for Binding[E].

Мне не совсем понятно, почему это происходит, но я предполагаю, что это связано с тем, что это вызов вложенного метода. Код компилируется отлично, если я объявляю функцию-член с Binding [E] в качестве параметра, например:

def someFunction(binding: Binding[E] = { // same code as above }

Почему это происходит, и как я могу обойти это?

4b9b3361

Ответ 1

Оказывается, это относительно легко решается путем неявной передачи манифеста для рассматриваемого типа либо в конструкторе, либо в самом методе:

class BasicService[E <: IEntity](serviceName: String, dataAccessObject: IDAO[E])(implicit m: Manifest[Binding[E]]) {

или

def render(implicit m: Manifest[Binding[E]])