gpt4 book ai didi

scala - 解释 "this.type"作为各种API方法的返回类型

转载 作者:行者123 更新时间:2023-12-01 00:58:47 24 4
gpt4 key购买 nike

我正在查看 Promise[T] 的源代码来自 scala.concurrent 的特征包裹。
所以这里是方法声明,我需要你在一个地方的帮助:

trait Promise[T] {
....
def complete(result: Try[T]): this.type =
if (tryComplete(result)) this else throw new IllegalStateException("Promise already completed.")
....
}

我真的不明白如何解释 this.type作为 complete方法返回类型。为什么不简单,返回类型可以是 Promise[T] ?

对不起,如果我的问题对某人来说太简单了,我只是在学习这些东西。

最佳答案

this.type在依赖于路径的上下文中是必要的:

scala> class A { class B; def f(b: B): A = this }
defined class A

scala> val a1 = new A; val b1 = new a1.B; val a2 = new A
a1: A = A@721f1edb
b1: a1.B = A$B@5922f665
a2: A = A@65e8e9b

scala> a1.f(b1)
res6: A = A@721f1edb

scala> a2.f(b1)
<console>:12: error: type mismatch;
found : a1.B
required: a2.B
a2.f(b1)
^

路径依赖意味着编译器知道类型属于一起。在上面的例子中可以看到 new a1.B产生类型 a1.B 的值不仅 B .但是,这不起作用:
scala> a1.f(b1).f(b1)
<console>:11: error: type mismatch;
found : a1.B
required: _2.B where val _2: A
a1.f(b1).f(b1)
^

问题在于 f 的返回类型是 A ,它不再有关于路径依赖关系的信息。返回 this.type而是告诉编译器返回类型满足这种关系:
scala> class A { class B; def f(b: B): this.type = this }
defined class A

scala> val a1 = new A; val b1 = new a1.B; val a2 = new A
a1: A = A@60c40d9c
b1: a1.B = A$B@6759ae65
a2: A = A@30c89de5

scala> a1.f(b1).f(b1)
res10: a1.type = A@60c40d9c

关于scala - 解释 "this.type"作为各种API方法的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25366012/

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