【发布时间】:2013-05-03 23:15:31
【问题描述】:
我有一个伪泛型类工厂,用于 DAO 目的。运营模式非常简单:
1) 使用特定 DAO 对象“T”类型的知识实例化工厂
2) 然后它创建一个 T
的内部实例
3) 它应该调用 T
的 trait-contracted 函数
4) 最后,返回 T 的实例(假设一切顺利)
看起来像这样:
class DAOFactory[T](implicit m: Manifest[T]) {
def obj = m.runtimeClass.asInstanceOf[Class[T]]
def doFoo(): Option[Any] = {
val dao = obj.asInstanceOf[DAO] // (A) this line will crash
println(obj.toString()) // some.object.called.DAOTodo
// val bar = dao.doSomethingSmart(now) <--- ALL DAO-derived classes implement this function
return Some(obj) // error-catching excluded for brevity
}
}
它是这样使用的:
val f = new DAOFactory[DAOTodo]
val shinyNewObject = f.doFoo() // 永远不会到达这里。
'DAOTodo' 实际上是一个实现 DAO 特征的类:
class DAOTodo extends DAO {
def doSomethingSmart(when: Whenever) = {...}
}
问:在“A”点需要做什么才能使用DAO作为“obj”的“doSomethingSmart”函数的接口?
提前致谢。
回答: 除了下面答案中概述的代码修改之外,由于正在创建的类的沿袭(在工厂内)有一个未实现的主构造函数,这并没有按预期运行。创建一个额外的零参数构造函数解决了这个问题。
【问题讨论】:
标签: scala generics casting traits