问题标签 [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.
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 的每个子类提供一个。
scala - 自我类型和特质子类有什么区别?
特质的自我类型A
:
说“A
不能混入不扩展的具体类B
”。
另一方面,以下内容:
说“任何(具体或抽象)类混入A
也将混入 B”。
这两个陈述不是同一个意思吗?self 类型似乎仅用于产生简单的编译时错误的可能性。
我错过了什么?
scala - 特征继承和自我类型注释之间的区别
在 Scala 中,我已经看到了这些构造
和
用于实现类似的事情(即S
必须在创建实例之前定义抽象方法)。他们之间有什么区别?你为什么要使用一个而不是另一个?
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),但他们大多只是陈述问题并得出结论,没有太多解释和/或解决方案(如果存在)。
scala - 如何使用 Scala 的 this 类型、抽象类型等来实现一个 Self 类型?
我在任何其他问题中都找不到答案。假设我有一个带有两个子类 Concrete1 和 Concrete1 的抽象超类 Abstract0。我希望能够在 Abstract0 中定义类似
其中 Self 将是具体的子类型。这将允许像这样链接调用 setOption:
并且仍然将 Concrete1 作为推断的 obj 类型。
我不想定义这个:
因为它使客户更难处理这种类型。我尝试了各种可能性,包括抽象类型:
但随后不可能实现 setOption,因为this
Abstract0 中没有 Self 类型。并且在 Abstract0 中使用this: Self =>
也不起作用。
这个问题有哪些解决方案?
scala - 命名为 Scala 的自类型仍然会影响“this”?
所以我创建了一个按预期失败的示例:
自我类型的“this”遮蔽了 B 的“this”——看起来很奇怪,但很有意义。
那么,给自我类型起一个不同的名字似乎是明智的。我这样做了,很惊讶:
还是有阴影???
更改“本地”变量的名称可以编译,这是有道理的:
(并且可以选择使用 self 类型名称来明确使用哪个“v”。)
好的。这意味着以下应该失败?
嗯?这是哪个?:-(
那么......命名自我类型有什么意义吗?无论如何,“这个”似乎最终都被遮蔽了。
或者这是范围规则的边缘情况,其中自我类型的“this”优先于特征的“this”——并且应该避免对相关特征中的事物使用相同的名称?
scala - scala self-type:值不是成员错误
这是对这个问题的跟进。
我正在尝试使用自类型使用通用超类在 scala 中实现向量:
这是一个 3D 向量的实现:
不幸的是,这不能编译:
出了什么问题,我该如何解决?
此外,任何关于自我类型的参考都将不胜感激,因为我认为这些错误是由于我缺乏理解而出现的。
scala - 为什么在受约束的 trait 上调用方法时不查找自类型?
假设
为什么编译器不“知道”我可以t
调用B
?
但我(显然是多余的?)需要做
scala - 覆盖特质和自我类型
我想覆盖 ScalaTest 特征 BeforeAndAfterEach 以便为我的所有测试实现一次。最后我得到了编译,但我不明白为什么。
让它工作的是这条线:
我在 BeforeAndAfterEach 实现的开头找到了它并复制了它。
它有什么作用,我为什么需要它?
更新:
这是一个更简单的版本。