在Scala 3中,不透明类型的示例如何调用在其支持类型上定义的方法

zqdjd7g9  于 4个月前  发布在  Scala
关注(0)|答案(1)|浏览(43)

根据Martin Ordersy撰写的《Advanced Programming in Scala 5th edition》一书,
请注意,在不透明类型中添加上限与定义类时的extends关键字不同。特别是,不透明类型不会继承其上限的接口。例如,尽管您可以在需要String的地方传递NonEmptyString,但您不能在NonEmptyString上调用类String上声明的方法:

object NonEmptyStrings:
  opaque type NonemptyString <: String = String
  object NonEmptyString:
    def apply(S: String): NonEmptyString = 
      require(s.nonEmpty)
      s
    def from(s: String): Option[NonEmptyString] = 
      if s.nonEmpty then Some(s) else None
……………………………………
// in a different .scala file
import NonEmptyStrings._
"hi".charAt(1) // i
NonEmptyString("hi").charAt(1)
1 |NonEmptyString("hi").charAt(1)
  |ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
  |value charAt is not a member of
  |NonEmptyStrings.NonEmptyString

字符串
您将能够在不透明类型上调用的唯一方法是在Any上定义的那些方法,以及通过为不透明类型定义的任何扩展方法添加的那些方法,即使不透明类型被给定了上限
但是当我这样编码时,没有异常发生。NonEmptyString("hi").charAt(1)正常运行,结果可以打印到i
但是当我这样写代码时,没有异常发生。NonEmptyString("hi").charAt(1)正常运行,结果可以打印到控制台显示i
我的实践并不像书中所预言的那样。

cnjp1d6j

cnjp1d6j1#

在与本书的一位作者进行了简短的讨论后,我确认这是不正确的或过时的,应该在下一版中修复。

相关问题