Я пишу DSL, и у меня есть ситуация, когда мне нужно, чтобы значение было неявно преобразовано в любой тип. Я создал класс-оболочки со значением и неявным методом, который в основном работает:Scala: могу ли я получить доступ к типу типизированного метода?
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, чтобы я мог действовать соответствующим образом?
Это в настоящее время, что я делаю. Проблема в том, что он не может справиться со всеми возможностями. Например, пользователь может захотеть использовать свой собственный класс. Если возможно, я бы хотел получить решение, которое может обрабатывать любой класс. – DeegC
'val str = ObjectOperationResult (" foo "); val i = str', это будет компилироваться как неявное преобразование 'ObjectOperationResult => Int' предоставляется' ObjectOperationResult.toInt', но будет работать как runtime из-за литого 'anyRefValyeOfStr.asInstanceOf [Int]'. Не безопасно для компиляции. – cchantep