gpt4 book ai didi

Scala 类型 A = B 和 C, `with` 是什么意思

转载 作者:行者123 更新时间:2023-12-02 21:16:38 25 4
gpt4 key购买 nike

有人可以解释并提供在定义类型时使用 with 关键字的真实示例吗?

让我们定义类型

type T = A with B

这是什么意思?什么时候应该使用它?如何实例化类型T

最佳答案

我猜它被称为类型连接。

您可以使用它来强制某种类型必须扩展所有指定的特征/类。一个愚蠢的例子:

scala> trait Quackable {
| def quack = println("quack")
| }
defined trait Quackable

scala> trait Walkable {
| def walk = println("walk")
| }
defined trait Walkable

scala> case class Duck(name: String) extends Quackable with Walkable
defined class Duck

scala> def foo(d: Quackable with Walkable): Unit = {
| d.quack
| d.walk
| }
foo: (d: Quackable with Walkable)Unit

scala> foo(Duck(""))
quack
walk

// Or you can create a type alias and use it.
scala> type QW = Quackable with Walkable
defined type alias QW

scala> def foo(d: QW): Unit = {
| d.quack
| d.walk
| }
foo: (d: QW)Unit

scala> foo(Duck(""))
quack
walk

// If you need to retain the type information for some reason, you can use a type parameter.

scala> def foo[A <: Quackable with Walkable](d: A): A = {
| d.quack
| d.walk
| d
| }
foo: [A <: Quackable with Walkable](d: A)A

scala> foo(Duck(""))
quack
walk
res1: Duck = Duck()

至于“如何实例化它”:不要那样想。 type 创建类型别名/同义词/函数,它们不一定代表具体的可实例化类型。

编辑:

如果您熟悉 Java,上面使用的 with 类似于 Java 的 &

public static <QW extends Quackable & Walkable> void foo(QW d) {
d.quack();
d.walk();
}

然而,与 Java 的 & 不同,with 为您提供了正确的类型。我编写的第一个 foo 定义无法翻译为 Java。另外,您不能使用 Java 的 & 执行以下操作。

scala> case object Quackawalkasaurus extends Quackable with Walkable
defined module Quackawalkasaurus

scala> List(Duck(""), Quackawalkasaurus)
res2: List[Product with Serializable with Quackable with Walkable] = List(Duck(), Quackawalkasaurus)

// Add an explicit type annotation if you want to remove unwanted common super-traits/classes.
scala> List(Duck(""), Quackawalkasaurus) : List[Quackable with Walkable]
res3: List[Quackable with Walkable] = List(Duck(), Quackawalkasaurus)

关于Scala 类型 A = B 和 C, `with` 是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13029447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com