我有一大包模型,我想清理一下。所以基本上,模型看起来像;
case class ExampleModel(…) extends Model {
…
}
object ExampleModel {
def find = new Finder[Long, ExampleModel](classOf[Long], classOf[ExampleModel]) // very repetitive
…
}
现在,我一直在尝试定义一个abstract class
,它为我提供了一个特定于对象的对象find
方法;
abstract class Findable[T: ClassTag] {
self: T => def find = new Finder[Long, T](classOf[Long], classOf[T])
}
但编译失败了:
class type required but T found
解决这个问题的正确方法是什么?
答案 0 :(得分:3)
你不能使用T作为自我类型,因为它在课堂定义时是未知的(同样你不能写class A[T] extends T
),你也不能#39 ;当你有ClassTag时需要传递classOf,所以应该足够:
scala> class Finder[A: ClassTag, B: ClassTag](){def getA = classTag[A].runtimeClass}
defined class Finder
scala> abstract class Findable[T: ClassTag] {def find = new Finder[Long, T]}
defined class Findable
最后:
scala> :paste
// Entering paste mode (ctrl-D to finish)
case class ExampleModel()
object ExampleModel extends Findable[ExampleModel]
// Exiting paste mode, now interpreting.
defined class ExampleModel
defined object ExampleModel
请注意,此处的T为case class ExampleModel
,但您可以simply obtain the companion
答案 1 :(得分:0)
为什么不只是
class Findable[T](clazz: Class[T]) {
def find(clazz: Class[T]) = new Finder(classOf[Long], clazz)
}
object ExampleModel extends Findable(classOf[ExampleModel])