是否可以将 Type 实例用作普通的Scala类型?例如,在以下代码段中,可以使用 tpe 找到 pi 吗?
import scala.reflect.runtime.universe._
implicit val pi: Double = 3.14159265
val tpe = typeOf[Double]
implicitly[Double] // pi
implicitly[tpe]???
我担心没有一个简单的解决方案来实现我的目标,而且我需要一种工厂将 tpe 隐式地翻译成 [Double] < / em>的。无论如何,我认为在Scala代码中集成反射类型可能非常强大,因此,并不像它看起来那么疯狂。
答案 0 :(得分:1)
我不知道这有多大意义。
让我们谈谈它对implicitly
的意义。如果没有这样的隐含或多个可以删除的话,它应该无法编译。
但是因为tpe
表示的实际类型直到运行时才知道,所以使implicitly
与类型实例一起工作将导致无法发出任何类型的编译错误。您可以做的最好的事情就是安排对implicitly
的任何调用始终进行编译,让编译器存储一个范围内所有隐式值的列表(对于任何类型),并在运行时查找此列表并抛出如果没有匹配tpe
所代表的类型(或者有多个),则会出现异常。
如果我们在谈论implicitly
的替代实现,比如说dynamicImplicitly
,那么这只会有一些意义。
请注意,这需要编译器的明确支持(在每次调用dynamicImplicitly
时捕获范围内的所有含义,因此这不仅仅是一个简单的函数),并且在效率方面非常低效space(在一个给定点可以在范围内有多少implicits?是的,很多,并且在每次调用dynamicImplicitly
时都需要在字节码中以某种方式引用它们。)
所以我的简短回答是:不要屏住呼吸,因为这个功能很快就会实现。
从技术上讲,有可能将dynamicImplicitly
实现为scala宏(假设可以从scala宏中获取范围内的所有隐含,我甚至不确定)