Scala:为什么我不能从复合类型成员创建匿名类?

时间:2016-07-14 07:03:16

标签: scala

trait Trait1
trait Trait2

object O {
  type Type1 = Trait1
  type Type2 = Trait1 with Trait2

  trait TraitMember1 extends Type1
  // this line fails to compile
  trait TraitMember2 extends Type2

  val anon1 = new Trait1 {}
  val anon2 = new Type1 {}

  val anon3 = new Trait1 with Trait2 {}
  // this line fails as well
  val anon4 = new Type2 {}
}

当您尝试编译上面的代码时,注释行会因错误class type required but Trait1 with Trait2 found而失败。这是为什么?我可以手动混合复合成员中的所有特征并创建一个匿名类。

1 个答案:

答案 0 :(得分:0)

http://www.scala-lang.org/old/node/6817.html中,马丁解释道:

  

我同意它可能有用。它不太清楚它应该是什么意思,   虽然。展开所有别名,删除parens然后进行线性化?要么   父母是否影响线性化,如果,是的,如何?我们接过了   简单的出路并禁止这些成语。

虽然在规范和编译器中可以很好地解决这种复杂性,但当规范与用户的心智模型不一致时,最终结果可能会导致意外。