问题标签 [self-type]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1418 浏览

java - 一般递归自类型的值的Java字段类型?

给定一个基类定义递归自类型的类层次结构:

我如何声明另一个类(它在 T 中不应该是通用的,因为这样的 T 可能在对象的生命周期内变化)具有可以包含 A 的任何子类的字段?

以下不起作用:

-- 问题结束 --

我注意到许多 StackOverflow 成员倾向于用“你为什么首先这样做?”来解决某些难题。以下是我使用这种模式的理由——您可以注意到 Java 标准库在其 Enum 类的定义中也使用了递归自类型:Enum<E extends Enum<E>>. 这个问题可以类似地被问为“如何定义类型的字段Enum<?>

理由示例:

与子类:

绑定到并行类层次结构:

并且随着 Bifyer 接口的实现管理的 B 实例的生成:

此接口的实现可能会为 B 返回 BSub1 或 BSub2。这本质上是访问者模式的应用程序,其中 Bifyer 是访问者,但与标准访问者不同,accept 方法返回一个值而不是 void。这提供了一个模块化框架,其中可以指定不同的 Bifyer 实现来为 Bify 方法提供替代行为和返回类型 - 例如为 B 的每个子类提供一个。

0 投票
11 回答
70390 浏览

scala - 自我类型和特质子类有什么区别?

特质的自我类型A

A不能混入不扩展的具体类B

另一方面,以下内容:

“任何(具体或抽象)类混入A也将混入 B”

这两个陈述不是同一个意思吗?self 类型似乎仅用于产生简单的编译时错误的可能性。

我错过了什么?

0 投票
6 回答
8512 浏览

scala - 特征继承和自我类型注释之间的区别

在 Scala 中,我已经看到了这些构造

用于实现类似的事情(即S必须在创建实例之前定义抽象方法)。他们之间有什么区别?你为什么要使用一个而不是另一个?

0 投票
1 回答
1803 浏览

inheritance - scala中的自类型继承

假设我具有以下特征:

编译器错误:illegal inheritance; self-type C does not conform to B's selftype B with A
正如预期的那样,如果我取消注释 self 类型注释,编译器会很高兴。

我认为很明显为什么 C 也需要这种 self 类型。我不明白为什么如果编译器已经知道它需要它,它为什么不能从 A “继承”它?

我认为当你使用具有复杂层次结构的 self 类型时,它可以减少冗长,特别是如果你混合一大堆特征,每个特征都有自己的 self 类型。

我想目前的行为可能有充分的理由,我只是找不到/弄清楚它是什么。

起初我认为它可能与 mixin 线性化有关,但在我看来它在这里不起作用(即使我有更多的特征与更复杂的自我类型混合)。

在某些情况下会引起歧义吗?如果是这样,为什么在没有歧义的情况下它不能工作?

还是与正确实施的一些困难有关?

我可以找到有关该主题的一些讨论(例如self type is not dedicated),但他们大多只是陈述问题并得出结论,没有太多解释和/或解决方案(如果存在)。

0 投票
2 回答
18194 浏览

scala - 如何使用 Scala 的 this 类型、抽象类型等来实现一个 Self 类型?

我在任何其他问题中都找不到答案。假设我有一个带有两个子类 Concrete1 和 Concrete1 的抽象超类 Abstract0。我希望能够在 Abstract0 中定义类似

其中 Self 将是具体的子类型。这将允许像这样链接调用 setOption:

并且仍然将 Concrete1 作为推断的 obj 类型。

我不想定义这个:

因为它使客户更难处理这种类型。我尝试了各种可能性,包括抽象类型:

但随后不可能实现 setOption,因为thisAbstract0 中没有 Self 类型。并且在 Abstract0 中使用this: Self =>也不起作用。

这个问题有哪些解决方案?

0 投票
2 回答
1160 浏览

scala - 命名为 Scala 的自类型仍然会影响“this”?

阅读这些 帖子让我觉得我至少在某种程度上理解了自我类型。

所以我创建了一个按预期失败的示例:

自我类型的“this”遮蔽了 B 的“this”——看起来很奇怪,但很有意义。

那么,给自我类型起一个不同的名字似乎是明智的。我这样做了,很惊讶:

还是有阴影???

更改“本地”变量的名称可以编译,这是有道理的:

(并且可以选择使用 self 类型名称来明确使用哪个“v”。)

好的。这意味着以下应该失败?

嗯?这是哪个?:-(

那么......命名自我类型有什么意义吗?无论如何,“这个”似乎最终都被遮蔽了。

或者这是范围规则的边缘情况,其中自我类型的“this”优先于特征的“this”——并且应该避免对相关特征中的事物使用相同的名称?

0 投票
2 回答
699 浏览

scala - scala self-type:类型参数错误的成员

这是对这个问题的跟进。

为什么这段代码无法编译,我该如何解决?

错误是:

0 投票
2 回答
4029 浏览

scala - scala self-type:值不是成员错误

这是对这个问题的跟进。

我正在尝试使用自类型使用通用超类在 scala 中实现向量:

这是一个 3D 向量的实现:

不幸的是,这不能编译:

出了什么问题,我该如何解决?

此外,任何关于自我类型的参考都将不胜感激,因为我认为这些错误是由于我缺乏理解而出现的。

0 投票
1 回答
150 浏览

scala - 为什么在受约束的 trait 上调用方法时不查找自类型?

假设

为什么编译器不“知道”我可以t调用B

但我(显然是多余的?)需要做

0 投票
3 回答
1198 浏览

scala - 覆盖特质和自我类型

我想覆盖 ScalaTest 特征 BeforeAndAfterEach 以便为我的所有测试实现一次。最后我得到了编译,但我不明白为什么。

让它工作的是这条线:

我在 BeforeAndAfterEach 实现的开头找到了它并复制了它。

它有什么作用,我为什么需要它?

更新:

这是一个更简单的版本。