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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:22:16