【问题标题】:Scala: "No manifest available for type T"Scala:“没有可用于类型 T 的清单”
【发布时间】:2014-10-06 19:05:19
【问题描述】:

我正在开发一个包含混合 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 }

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

【问题讨论】:

标签: scala generics types


【解决方案1】:

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

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

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

【讨论】:

  • 你能展示你如何初始化隐式val吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多