1

是否可以将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]。无论如何,我认为在 Scala 代码中集成反射类型可能非常强大,因此并不像看起来那么疯狂。

4

1 回答 1

1

我不明白这有多大意义。

让我们谈谈它的意义implicitly。如果没有这样的隐含或不止一个 eligeable,它应该无法编译。但是由于由 表示的实际类型tpe直到运行时才知道,因此implicitly使用类型实例将不可能发出任何类型的编译错误。您可以做的最好的事情是安排对implicitly始终编译的任何调用,让编译器在某处存储范围内所有隐式值的列表(对于任何类型),并在运行时在此列表中查找并在不匹配时抛出异常表示的类型tpe(或者如果有多个)。implicitly如果我们谈论的是 的替代实现,这可能只有某种意义dynamicImplicitly

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

所以我的简短回答是:不要屏住呼吸等待这个功能很快就会实施。从技术上讲,它可能可以实现dynamicImplicitly为 scala 宏(前提是可以从 scala 宏中获取范围内的所有隐式,我什至不确定)

于 2012-10-04T16:25:58.450 回答