在惰性求值中解释这种类型不匹配

时间:2011-09-22 05:47:11

标签: scala

尝试发表this评论,我写了以下代码:

def breakfast : AnyRef = {

    class Chicken  (e: =>Egg) { 
      lazy val offspring = e 
    }

    class Egg (c: =>Chicken) {
      lazy val mother = c
    }
   lazy val (egg: Egg, chicken: Chicken) = (new Egg(chicken), 
new Chicken(egg))
  egg  
}

它起作用,它完全符合你的希望。我没有得到的是,: AnyRef为什么必要?如果没有包含它,编译器(至少2.8编译器)会死于可怕的死亡:

  

错误:类型不匹配;发现:Egg(懒惰值为scala_repl_value)   其中类型为Egg(在惰性值scala_repl_value中)<:java.lang.Object   与ScalaObject {懒惰的母亲:鸡}需要:(一些   其他)蛋(在懒惰值scala_repl_value中)forSome {type(some   其他)Egg(在惰性值scala_repl_value中)<:java.lang.Object with   ScalaObject {懒惰的母亲:鸡};鸡肉类型<:   带有ScalaObject的java.lang.Object {lazy def offspring :(有些   其他)蛋(在惰性值scala_repl_value中)}}对象   RequestResult $ line16 $ object {

有人能解释一下这里发生了什么吗?

1 个答案:

答案 0 :(得分:4)

您在Chicken函数的范围内定义了类Eggbreakfast,因此在外面看不到它们,即除breakfast之外的任何人都不知道这些类。在Scala 2.9中,此片段实际上有效,breakfast函数的返回值定义为

def breakfast: Egg forSome { type Egg <: java.lang.object with scalaobject{lazy val mother: chicken}; type chicken <

当在函数之外定义的类时,一切都按预期工作

class Chicken(e: => Egg) {
  lazy val offspring = e
}

class Egg(c: => Chicken) {
  lazy val mother = c
}

def breakfast: Egg = {

  lazy val (egg: Egg, chicken: Chicken) =
    (new Egg(chicken), new Chicken(egg))

  egg
}