Scala 3如何替代Manifest实现Java风格的类型信息字符串输出
实现方案
直接通过Scala 3 编译期API递归遍历类型结构即可,不需要依赖预定义的Printer,完整可运行代码如下:
import scala.quoted.* inline def typeOf[T]: String = ${typeOfImpl[T]} private def typeOfImpl[T: Type](using Quotes): Expr[String] = import quotes.reflect.* def loop(repr: TypeRepr): String = // 取当前类型的简单名称 val simpleName = repr.typeSymbol.name // 取当前类型的所有泛型参数 val typeArgs = repr.typeArgs if typeArgs.isEmpty then simpleName else // 递归处理所有参数后拼接成要求的格式 val argsStr = typeArgs.map(loop).mkString(",") s"$simpleName<$argsStr>" // 将编译期计算得到的字符串转为常量返回 Expr(loop(TypeRepr.of[T]))
验证效果
调用结果完全符合你要求的输出格式:
typeOf[List[String]]输出List<String>typeOf[List[Option[String]]]输出List<Option<String>>typeOf[Map[String,Option[Int]]]输出Map<String,Option<Int>>
逻辑说明
- 用
inline标记触发编译期宏调用,将类型T的完整信息带入编译阶段 - 递归函数
loop逐层拆解类型结构:无泛型参数直接返回类名,有泛型参数则递归处理所有参数后拼接为<参数1,参数2,...>格式 - 最终返回值是编译期生成的字符串常量,运行期无额外计算开销
- 仅处理普通参数化类型,刚好匹配你要求的覆盖范围,不需要额外处理复杂类型场景
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

