Scala的Vector是否在Seq等父类方法基础上新增了独有方法?
Scala Vector 相对于Seq父类的独有方法说明
结论:scala.collection.immutable.Vector 确实存在少量父类/父特质未声明的独有方法,但这些方法基本都是底层实现专用,面向普通开发者尤其是初学者的常用方法,全部已经在Seq层面定义,Vector会直接继承,不需要重复翻译。
Vector自身声明的公开独有方法极少,主要包含两类:
- 底层结构相关方法:比如
trieIterator,是基于Vector底层的Trie树存储结构实现的专用迭代器,性能比通用Seq迭代器更高,但只在需要极致性能的场景使用,教学场景几乎不会接触 - 序列化相关的受保护方法:比如
writeReplace,是Java序列化机制调用的内部方法,用户代码不会直接调用
你在Seq层面实现的隐式翻译类,会自动对Vector生效,完全符合DRY原则,日常教学用到的head、tail、map、filter、length、updated等所有常用方法都不需要重复编写翻译逻辑。
自动识别任意类独有方法的通用方案
不需要手动逐行对比源码,有三种成熟的通用方式可以快速拿到类的独有方法:
- 基于Scala反射自动计算差集:通过Scala运行时反射,分别获取目标类和其父类的成员集合,做差集就能得到独有方法,示例代码如下:
import scala.reflect.runtime.universe._ def getClassUniqueMethods[Child: TypeTag, Parent: TypeTag]: Set[String] = { // 过滤掉构造方法、java.lang.Object继承的通用方法 def getPublicMethodNames(tp: Type): Set[String] = { tp.members .filter(m => !m.isConstructor && m.isPublic) .filterNot(_.owner == typeOf[java.lang.Object]) .map(_.name.decodedName.toString) .toSet } getPublicMethodNames(typeOf[Child]) -- getPublicMethodNames(typeOf[Parent]) } // 用法示例:获取Vector相对于Seq的独有公开方法 val vectorUniqueMethods = getClassUniqueMethods[Vector[?], Seq[?]] println(vectorUniqueMethods)
运行上述代码就能直接输出Vector所有没有在Seq中声明的公开方法名。
- IDE结构视图筛选:在支持Scala的IDE中打开目标类源码,侧边的结构视图会对继承来的方法做特殊标记,没有继承标记的方法就是当前类独有的方法,直接筛选即可。
- Scaladoc过滤:打开对应Scala版本的标准库文档,进入目标类的说明页,在成员筛选栏中隐藏继承自父类的成员,剩下展示的就是当前类声明的独有方法。
针对Kojo的本地化开发场景,你完全可以先留空Vector的专属翻译类,等后续实际遇到用户调用Vector独有方法的场景,再按需补充翻译即可,不需要提前做冗余的适配工作。
内容的提问来源于stack exchange,提问作者Ben Bulent Basaran
相关产品推荐
相关产品推荐

