gpt4 book ai didi

scala - 以下 'illegal inheritance' (Scala 2.9.2) 背后的原因是什么?

转载 作者:行者123 更新时间:2023-12-04 05:40:58 27 4
gpt4 key购买 nike

更新:我用一个更小更精确的例子重新表述了我的问题。

假设,我们有以下定义:

class A
trait TraitForA extends A

class D[T]
trait TraitForD extends D[A]

然后我们可以创建一个对象,如:
scala> new D[A] with TraitForD
res0: D[A] with TraitForD = $anon$1@145d424

但是我们不能创建以下对象:
scala> new D[A with TraitForA] with TraitForD
<console>:12: error: illegal inheritance;
anonymous class $anon inherits different type instances of class D:
D[A] and D[A with TraitForA]
new D[A with TraitForA] with TraitForD
^

同样的事情发生,当使用 self 类型而不是 extends 作为特征时:
scala> trait TraitForD2 { self: D[A] => }
defined trait TraitForD2

scala> new D[A with TraitForA] with TraitForD2
<console>:12: error: illegal inheritance;
self-type D[A with TraitForA] with TraitForD2 does not conform to TraitForD2's
selftype TraitForD2 with D[A]
new D[A with TraitForA] with TraitForD2
^

上面的创作(究竟)有什么问题?

我的猜测是,那个 D[A with TraitForA]不被视为类型 D[A] .使用协变注释时 +T在类 D ,这两个例子都有效。

有人可以解释一下这些示例失败的原因以及为什么它们与 +T 一起工作吗? ?

额外问题:有没有办法在没有 +T 的情况下运行示例? ?

最佳答案

考虑

class C[T]{ def f(t: T): T = t }
C[A with Y]说它将有一个 f这只需要 A with Y ,并且只会返回 A with Y . C[A]不能被满足此请求的函数所满足。因此两者是矛盾的。

由于类型声明的成功并不取决于所涉及的任何类的方法的细节, Z1 with Z2或任何其他组合方式 C[A]C[A with Y]一定是错误。

关于scala - 以下 'illegal inheritance' (Scala 2.9.2) 背后的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11253770/

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