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

Scala 2注解宏异常求助:同逻辑注解因类名不同报错

问题原因与解决方案

核心原因:Scala标识符解析规则与命名规范冲突

Scala编译器对标识符的解析逻辑和命名规范直接导致了这个问题:

  1. 类型与值的标识符区分:Scala约定类型名(类/特质)首字母大写,值/方法名首字母小写。编译器在处理注解时,会优先将小写开头的标识符解析为值而非类型:
    • grpcMock是小写开头的驼峰名,编译器会把它当成值(如变量/对象)而非类,因此报错“not found type: grpcMock”;
    • foo是全小写类名,编译器虽然能识别为类,但宏注解的语法校验逻辑会拒绝不符合命名规范的注解类,导致“invalid annotation new foo()”错误。
  2. @client能运行是个特例:因为client没有和当前作用域内的其他值/方法重名,编译器才勉强将其识别为类,但这本身不符合Scala的命名规范,属于不稳定的写法。

解决方案:遵循Scala类型命名规范

将所有注解类的首字母改为大写(大驼峰命名),这是Scala类型的标准命名方式,编译器能准确识别并处理:

class Client(val port: Int = 9000) extends StaticAnnotation {
  def macroTransform(annottees: Any*): Any = macro ClientGen.mkClient
}

class GrpcMock(val port: Int = 9000) extends StaticAnnotation {
  def macroTransform(annottees: Any*): Any = macro ClientGen.mkClient 
}

class Foo(val port: Int = 9000) extends StaticAnnotation {
  def macroTransform(annottees: Any*): Any = macro ClientGen.mkClient
}

使用时对应改为大写开头的注解名:

  • @Client object Foo
  • @GrpcMock object Foo
  • @Foo object Foo

这样就能完全避免解析错误,和你之前正常运行的旧注解保持一致的命名规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:18:22