Link Search Menu Expand Document

并集类型

并集类型 A | B 包括类型 A 与类型 B 的所有值。

case class UserName(name: String)
case class Password(hash: Hash)

def help(id: UserName | Password) = {
   val user = id match
      case UserName(name) => lookupName(name)
      case Password(hash) => lookupPassword(hash)
   ...
}

并集类型是交集类型的对偶。|可交换的A | BB | A 是相同的类型。

只有在显式指定并集类型时,编译器才会将交集类型指定给表达式。 这可以在下面的 REPL transcript 中观察到:

scala> val password = Password(123)
val password: Password = Password(123)

scala> val name = UserName("Eve")
val name: UserName = UserName(Eve)

scala> if true then name else password
val res2: Object & Product = UserName(Eve)

scala> val either: Password | UserName = if true then name else password
val either: Password | UserName = UserName(Eve)

res2 的类型是 Object & Product,是 UserNamePassword 的超类型,但不是最小超类型 Password | UserName。如果我们想要最小的超类型,我们必须显式给出它,as is done for the type of either

更多细节