从类型实例中查找隐式

时间:2012-10-04 14:55:27

标签: scala reflection scala-2.10

是否可以将 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代码中集成反射类型可能非常强大,因此,并不像它看起来那么疯狂。

1 个答案:

答案 0 :(得分:1)

我不知道这有多大意义。

让我们谈谈它对implicitly的意义。如果没有这样的隐含或多个可以删除的话,它应该无法编译。 但是因为tpe表示的实际类型直到运行时才知道,所以使implicitly与类型实例一起工作将导致无法发出任何类型的编译错误。您可以做的最好的事情就是安排对implicitly的任何调用始终进行编译,让编译器存储一个范围内所有隐式值的列表(对于任何类型),并在运行时查找此列表并抛出如果没有匹配tpe所代表的类型(或者有多个),则会出现异常。 如果我们在谈论implicitly的替代实现,比如说dynamicImplicitly,那么这只会有一些意义。

请注意,这需要编译器的明确支持(在每次调用dynamicImplicitly时捕获范围内的所有含义,因此这不仅仅是一个简单的函数),并且在效率方面非常低效space(在一个给定点可以在范围内有多少implicits?是的,很多,并且在每次调用dynamicImplicitly时都需要在字节码中以某种方式引用它们。)

所以我的简短回答是:不要屏住呼吸,因为这个功能很快就会实现。 从技术上讲,有可能将dynamicImplicitly实现为scala宏(假设可以从scala宏中获取范围内的所有隐含,我甚至不确定)