如何解决Scala编译器的“类X继承类Y [Z]的不同类型实例”错误?

时间:2014-01-08 23:20:58

标签: scala parent-child multiple-inheritance traits

给出以下代码:

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两个特征。

1 个答案:

答案 0 :(得分:0)

这个定义有效:

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]]