获取作为类型参数传递的文字类型的值

问题描述

我正在尝试编写一个宏,该宏返回作为类型参数传递的文字类型的值,如果参数不是文字类型,则无法编译。以下是一些示例:

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 返回独特的开箱即用的居民

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.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...