Abstract类提供特定于扩展类/对象的方法

时间:2015-01-12 11:11:44

标签: scala inheritance abstract-class

我有一大包模型,我想清理一下。所以基本上,模型看起来像;

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

解决这个问题的正确方法是什么?

2 个答案:

答案 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])