csv*_*van 15 generics types scala
我正在使用混合Scala和Java代码的Lift项目.
在Java方面,我有以下相关项目:
interface IEntity
interface IDAO<T extends IEntity> {
void persist(T t);
}
Run Code Online (Sandbox Code Playgroud)
在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)
}
})
)
)
}
Run Code Online (Sandbox Code Playgroud)
此代码将无法编译.我在上面指出的点上得到以下错误:
No Manifest available for Binding[E].
Run Code Online (Sandbox Code Playgroud)
我不清楚为什么会发生这种情况,但我猜它与嵌套方法调用有关.如果我使用Binding [E]作为参数声明成员函数,则代码编译正常,例如:
def someFunction(binding: Binding[E] = { // same code as above }
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我该如何解决这个问题呢?
csv*_*van 18
事实证明,通过在构造函数或方法本身中隐式传递相关类型的清单,可以相对容易地解决这个问题:
class BasicService[E <: IEntity](serviceName: String, dataAccessObject: IDAO[E])(implicit m: Manifest[Binding[E]]) {
Run Code Online (Sandbox Code Playgroud)
要么
def render(implicit m: Manifest[Binding[E]])
Run Code Online (Sandbox Code Playgroud)