1/ 如第一个示例中所示(以及问题标题所暗示的那样)在顶层定义不透明类型是反模式。
目的是限制不透明类型转换的理解范围,通常是在单例中(HandleAWrap
)就像你在第二个例子中所做的那样。
2/ 不透明类型的扩展方法应放置在该类型的伴生对象中。这使得它们对使用该类型的任何人都可见,而无需显式导入。同样,第二个例子是正确的,而不是第一个例子。
3/ @targetName
在你的第二个例子中不需要,因为扩展方法是在object HandleA
and object HandleB
分别且不碰撞。
File handleA.scala
:
package x
object HandleAWorld:
opaque type HandleA = Int
object HandleA:
def apply(value:Int): HandleA = value
extension (handle:HandleA) def value : Int = handle
File handleB.scala
同样对于HandleB
.
File lib.scala
:
package x
export HandleAWorld.*
export HandleBWorld.*
Usage :
Welcome to Scala 3.2.2 (11.0.18, Java OpenJDK 64-Bit Server VM).
Type in expressions for evaluation. Or try :help.
scala> import x.*
scala> val a = HandleA(42)
val a: x.HandleAWorld.HandleA = 42
scala> val b = HandleB(3)
val b: x.HandleBWorld.HandleB = 3
scala> a.value
val res0: Int = 42
scala> b.value
val res1: Int = 3
4/ 即使有@targetName
,上面的例子编译通过。
这cyclic reference via <import>
您遇到的错误可能与不透明类型无关,也与@targetName
.