Scala:我可以访问类型化方法的类型吗?

时间:2015-07-03 19:51:18

标签: scala methods implicit typed

我正在编写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的类型,所以我可以采取相应的行动?

2 个答案:

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