【发布时间】:2014-05-07 11:51:04
【问题描述】:
理想情况下,我希望能够在 Scala 中执行以下操作:
import Builders._
val myBuilder = builder[TypeToBuild] // Returns instance of TypeToBuildBuilder
val obj = myBuilder.methodOnTypeToBuildBuilder(...).build()
原则上,目标只是能够使用外部映射定义将TypeToBuild“映射”到TypeToBuildBuilder(即假设无法更改这些类)并在类型推断中利用这一点.
我使用AnyRef 类型进行了以下工作:
import Builders._
val myBuilder = builder(TypeToBuild)
myBuilder.methodOnTypeToBuildBuilder(...).build()
object Builders {
implicit val typeToBuildBuilderFactory =
new BuilderFactory[TypeToBuild.type, TypeToBuildBuilder]
def builder[T, B](typ: T)(implicit ev: BuilderFactory[T, B]): B = ev.create
}
class BuilderFactory[T, B: ClassTag] {
def create: B = classTag[B].runtimeClass.newInstance().asInstanceOf[B]
}
请注意,类型是作为函数参数而不是类型参数传递的。
我非常高兴知道如何使上述内容与Any 类型一起工作,而不仅仅是AnyRef 类型。似乎这个限制来自于 Singleton 类型仅支持 AnyRefs(即我使用 TypeToBuild.type)。
话虽如此,解决原始“理想”场景(使用类型参数而不是函数参数)的答案会很棒!
编辑
需要classOf[_] 的可能解决方案(真的很喜欢不需要使用classOf!):
import Builders._
val myBuilder = builder(classOf[TypeToBuild])
myBuilder.methodOnTypeToBuildBuilder(...).build()
object Builders {
implicit val typeToBuildBuilderFactory =
new BuilderFactory[classOf[TypeToBuild], TypeToBuildBuilder]
def builder[T, B](typ: T)(implicit ev: BuilderFactory[T, B]): B = ev.create
}
class BuilderFactory[T, B: ClassTag] {
def create: B = classTag[B].runtimeClass.newInstance().asInstanceOf[B]
}
能够只使用builder(TypeToBuild) 真的只是优雅/简洁的胜利。能够使用builder[TypeToBuild] 会很酷,因为也许有一天这会奏效(在 Scala 中类型推断的进步):
val obj: TypeToBuild = builder.methodOnTypeToBuildBuilder(...).build();
这是一个使用 classOf 的完整工作示例:http://ideone.com/94rat3
【问题讨论】:
标签: scala types implicit implicit-typing