【问题标题】:How to solve Scala compiler's "class X inherits different type instances of class Y[Z]" error?如何解决 Scala 编译器“X 类继承 Y[Z] 类的不同类型实例”错误?
【发布时间】:2025-12-02 16:30:01
【问题描述】:

给定以下代码:

sealed abstract class Foobar[+Parent <: Foobar[Parent]](parent: Option[Parent])

trait Foo[+Parent <: Foobar[Parent]] extends Foobar[Foo[Parent]]

trait Bar[+Parent <: Foobar[Parent]] extends Foobar[Bar[Parent]]

class Raboof[+Parent <: Foobar[Parent]](val parent: Foo[Parent]) extends Foobar(Some(parent)) with Foo[Parent] with Bar[Parent]

在 Scala 的类型系统中如何解决这个继承问题?

动机:假设的特征FooBar 将实现由多个类提供的方法,例如混合这些特征的类Raboof

Scala-SDK 版本 3.0.2-vfinal-20131028-1923-Typesafe 的 Scala 工作表抱怨以下内容:

illegal inheritance;  class Raboof inherits different type instances of class Foobar: scrap.Foobar[scrap.Bar[Parent]] and scrap.Foobar[scrap.Foo[Parent]]

不同类型的实例scrap.Foobar[scrap.Bar[Parent]]scrap.Foobar[scrap.Foo[Parent]] 应该分解为一个类型。在我对scrap.Foobar[scrap.Raboof[Parent]] 的理解中,因为Raboof 类混合了FooBar 这两个特征。

【问题讨论】:

    标签: scala parent-child multiple-inheritance traits


    【解决方案1】:

    这个定义有效:

    class Raboof[+Parent <: Foobar[Parent]](val parent: Raboof[Parent]) extends 
      Foobar[Raboof[Parent]](Some(parent)) with Foo[Parent] with Bar[Parent]
    

    你原来的定义:

    1. 没有告诉 Scala 如何组合 Foobar[Foo[Parent]]Foobar[Bar[Parent]]。因为Foobar[Raboof[Parent]] 是两者的子类型,所以这行得通。

    2. val parent 的类型错误,因为 Foobar[Bar[Parent]] 需要 parent: Bar[Parent]]

    【讨论】:

      最近更新 更多