根据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
。
我的实践并不像书中所预言的那样。
1条答案
按热度按时间cnjp1d6j1#
在与本书的一位作者进行了简短的讨论后,我确认这是不正确的或过时的,应该在下一版中修复。