获取作为类型参数传递的文字类型的值
Get value of a literal type passed as type parameter
我正在尝试编写一个宏,其中 returns 将文字类型的值作为类型参数传递,如果参数不是文字类型,则无法编译。以下是一些示例:
def literalValue[SC <: String] = //...
literalValue["AB"] // returns "AB"
literalValue["C"] // returns "C"
literalValue[String] // compile error
所以我从一个常规的宏样板开始,遇到了以下问题:
def implStringLiteral[SC <: String: c.WeakTypeTag](c: blackbox.Context): c.Expr[SC] = {
import c.universe._
val symbol = weakTypeOf[SC].typeSymbol //It is String
//...
}
似乎文字类型本身作为常规 String
传递,因此无法通过其 WeakTypeTag
.
获得精确的类型信息
是否有解决此问题的方法?
ValueOf[T]
typeclass returns 开箱即用的独特居民
scala> valueOf
def valueOf[T](implicit vt: ValueOf[T]): T
scala> valueOf["AB"]
val res2: String = AB
scala> valueOf[42]
val res3: Int = 42
scala> object Foo
object Foo
scala> valueOf[Foo.type]
val res4: Foo.type = Foo$@6e1ad658
scala> valueOf[Unit]
scala> .toString
val res6: String = ()
scala> valueOf[String]
^
error: No singleton value available for String.
我正在尝试编写一个宏,其中 returns 将文字类型的值作为类型参数传递,如果参数不是文字类型,则无法编译。以下是一些示例:
def literalValue[SC <: String] = //...
literalValue["AB"] // returns "AB"
literalValue["C"] // returns "C"
literalValue[String] // compile error
所以我从一个常规的宏样板开始,遇到了以下问题:
def implStringLiteral[SC <: String: c.WeakTypeTag](c: blackbox.Context): c.Expr[SC] = {
import c.universe._
val symbol = weakTypeOf[SC].typeSymbol //It is String
//...
}
似乎文字类型本身作为常规 String
传递,因此无法通过其 WeakTypeTag
.
是否有解决此问题的方法?
ValueOf[T]
typeclass returns 开箱即用的独特居民
scala> valueOf
def valueOf[T](implicit vt: ValueOf[T]): T
scala> valueOf["AB"]
val res2: String = AB
scala> valueOf[42]
val res3: Int = 42
scala> object Foo
object Foo
scala> valueOf[Foo.type]
val res4: Foo.type = Foo$@6e1ad658
scala> valueOf[Unit]
scala> .toString
val res6: String = ()
scala> valueOf[String]
^
error: No singleton value available for String.