gpt4 book ai didi

Scala:非法继承; self 类型 Y 不符合 X 的 self 类型 SELF

转载 作者:行者123 更新时间:2023-12-03 22:28:59 28 4
gpt4 key购买 nike

我有一个 trait,它接受一个类型参数,我想说实现这个 trait 的对象也会符合这个类型参数(使用泛型,为了 Java 的兼容性)

以下代码:

trait HandleOwner[SELF <: HandleOwner[SELF]] {
self : SELF =>
// ...
def handle: Handle[SELF]
}

trait Common[SELF <: Common[SELF]] extends HandleOwner[SELF] {
// ...
}

给了我以下错误:
illegal inheritance;  self-type test.Common[SELF] does not conform to
test.HandleOwner[SELF]'s selftype SELF

如果我将 Common 更改为:
trait Common[SELF <: Common[SELF]]  extends HandleOwner[SELF] {
self : SELF =>
// ...
}

然后错误消失。

为什么我必须在每个非具体类型中重复相同的声明。如果我有一个基类,并说“extends Comparable”,我就不必在每个派生类型中重复“extends Comparable”,只要具体类实现 compareTo 方法。我认为这里应该是一样的。我只是说扩展 HandleOwner 的类型也是 SELF,编译器应该只接受它,并考虑它,而不要求每个非具体子类型再次重复相同的事情。

这样做是为了避免使用类转换,但我将从字面上扩展这个特性的每个类,而且我认为我不应该重复数百甚至数千次这个声明!

最佳答案

Self 类型更类似于泛型约束而不是继承。与 class C[A <: B] ,必须在子类中一直重复约束:class D[A <: B] extends C[A] .必须重复约束,直到满足为止,即直到您选择了确实满足 <: B 的实际参数类型为止。 . self 类型也是如此。写作 self: A =>不会使您的类型扩展 A .它确保它在实际实例化之前最终必须与 A 混合。

相反,当您扩展 Comparable 时,您已将您的类(class)设为 Comparable ,不为以后设置约束。但事实是你需要实现 compareTo还得一直重复abstract直到你真正实现它。

当然编译器可以不用重复 <: B , self: A => , 和 abstract ,信息是可用的。这是语言设计者的选择。至少,不得不重复 self: A =>与其他地方的规则没有什么不同。

关于Scala:非法继承; self 类型 Y 不符合 X 的 self 类型 SELF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7378901/

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