Scala 3中能否在不透明类型扩展里用export选择性暴露内部方法?
Scala 3 不透明类型与export配合的替代方案
你尝试通过extension配合export导出不透明类型底层类型的方法,但这种写法无法达到预期——export会直接暴露原BigInt的unary_-方法,返回类型是BigInt而非BigNumber,导致类型不匹配。
以下是可行的替代方案:
方案一:手动实现扩展方法
利用不透明类型在伴生作用域内可直接转换的特性,直接在extension中实现目标方法,将底层运算结果包装为不透明类型返回:
opaque type BigNumber = BigInt object BigNumber: def apply(s: String): BigNumber = BigInt(s) extension (cv: BigNumber) def myUnary: BigNumber = -cv val c = BigNumber("7") c.myUnary // 返回BigNumber类型的-7,符合预期
方案二:批量转发方法(适合多场景)
如果需要导出多个底层方法,可在伴生对象内部定义私有隐式转换,再逐个转发方法,确保类型安全:
opaque type BigNumber = BigInt object BigNumber: def apply(s: String): BigNumber = BigInt(s) // 仅在伴生作用域内生效的私有隐式转换 private given Conversion[BigInt, BigNumber] = identity extension (cv: BigNumber) def myUnary: BigNumber = -cv def plus(other: BigNumber): BigNumber = cv + other def minus(other: BigNumber): BigNumber = cv - other // 按需添加其他需要的方法
原理说明
在不透明类型的伴生对象内部,底层类型(BigInt)与不透明类型(BigNumber)是互通的,无需显式转换。因此直接返回底层运算结果时,编译器会自动将其识别为不透明类型,对外暴露的类型完全符合预期。
内容的提问来源于stack exchange,提问作者Waldemar Wosiński
相关产品推荐
相关产品推荐

