You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>>

逻辑说明

  1. 用inline标记触发编译期宏调用,将类型T的完整信息带入编译阶段
  2. 递归函数loop逐层拆解类型结构:无泛型参数直接返回类名,有泛型参数则递归处理所有参数后拼接为<参数1,参数2,...>格式
  3. 最终返回值是编译期生成的字符串常量,运行期无额外计算开销
  4. 仅处理普通参数化类型,刚好匹配你要求的覆盖范围,不需要额外处理复杂类型场景

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:27:03