Scala 2.13.0-M3中scala.reflect.internal.Trees$Literal是否被迁移?
Scala 2.13.0-M3编译错误:
type Trees$Literal is not a member of package scala.reflect.internal 解决方案 没错,这个问题完全是Scala 2.13系列的API变更导致的——尤其是它对内部反射模块做了不小的重构,而你用到的scala.reflect.internal.Trees$Literal正好是被调整的内部API之一。
在Scala 2.11和2.12中,你可以直接通过scala.reflect.internal.Trees.Literal(或者编译器生成的内部类Trees$Literal)访问字面量对应的语法树节点,但从2.13开始,Scala团队对内部反射的结构进行了梳理,这个类的访问路径和定义方式都发生了变化。
快速修复方案
如果你的代码必须依赖内部反射API,那么在2.13里需要调整引用方式:
原来的代码可能类似这样:
import scala.reflect.internal.Trees$Literal // 或者直接使用scala.reflect.internal.Trees.Literal
现在需要改成:
import scala.reflect.internal.Trees // 通过Trees的伴生对象直接引用Literal val myLiteral: Trees.Literal = Trees.Literal(Trees.Constant("test"))
不过更推荐的做法是避免直接使用scala.reflect.internal下的API——这些都是Scala的内部私有接口,官方不会保证跨版本的兼容性,每次大版本迭代都可能被修改甚至移除。如果是写宏或者反射相关代码,尽量使用公开的反射API,比如scala.reflect.runtime.universe(运行时反射)或者宏上下文里的c.universe(编译时宏),以Literal为例,公开API的引用方式是:
// 运行时反射场景 import scala.reflect.runtime.universe._ val literal = Literal(Constant("test")) // 宏场景 def myMacro(c: scala.reflect.macros.blackbox.Context)(...) = { import c.universe._ val literal = Literal(Constant("test")) // ... }
这样的代码在跨Scala版本时会稳定很多。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

