我正在编写DSL,我的情况是我希望将某个值隐式转换为任何类型。我已经创建了一个包装类,其中包含值和一个主要工作的隐式方法:
case class ObjectOperationResult( val value: AnyRef )
object ObjectOperationResult {
implicit def result2T[ T ]( result: ObjectOperationResult ): T = {
result.value.asInstanceOf[ T ]
}
}
如果result.value不是有效类型,代码将抛出异常;它取决于用户,以确保他们做正确的事情。但是,我想通过根据目标类型执行不同的逻辑来使其变得更聪明。例如,如果目标类型是String调用toString而不是asInstanceOf [];像这样的东西:
case class ObjectOperationResult( val value: AnyRef )
object ObjectOperationResult {
implicit def result2T[ T ]( result: ObjectOperationResult ): T = {
match T {
case String s: result.value.toString
case _ : result.value.asInstanceOf[ T ]
}
}
}
这不编译;有没有办法确定T的类型,所以我可以采取相应的行动?
答案 0 :(得分:-1)
您可以定义多个功能,例如
object ObjectOperationResult {
implicit def toString( result: ObjectOperationResult ): String = result.value.toString.trim
implicit def toInt( result: ObjectOperationResult ): Int = result.value.asInstanceOf[Int]
}
由于某些原因,这种方法更好:
1.您的代码只能使用正确的类型进行编译。编译错误总是更好,然后是运行时错误
2.您可以明确调用此函数。如果您将从Java调用此代码,这可能非常重要。
答案 1 :(得分:-1)
这样做的一种方法是将类类型作为参数和条件传递给它。
import reflect.runtime.universe._
case class ObjectOperationResult( val value: AnyRef )
object ObjectOperationResult {
def result2T[T: TypeTag](c: Class[T], result: ObjectOperationResult): T = {
c match {
case s if typeOf[T] <:< typeOf[String] => result.value.toString.asInstanceOf[T]
case _ => result.value.asInstanceOf[T]
}
}
}
以下是如何使用它:
val a = ObjectOperationResult("hello")
val b = ObjectOperationResult(new java.util.Date())
ObjectOperationResult.result2T(classOf[String], a)
res0: String = hello
ObjectOperationResult.result2T(classOf[String], b)
res1: String = Fri Jul 03 13:15:12 PDT 2015
ObjectOperationResult.result2T(classOf[java.util.Date], b)
res2: java.util.Date = Fri Jul 03 13:15:12 PDT 2015