Scala:"没有可用于T&#34类型的清单;

时间:2014-08-13 12:13:02

标签: scala generics types

我正在使用混合Scala和Java代码的Lift项目。

在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 }

为什么会发生这种情况,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:17)

事实证明,通过在构造函数或方法本身中隐式传递相关类型的清单,可以相对容易地解决这个问题:

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

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