2011-09-22 88 views
4

试图神交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编译器)死一个可怕的死亡:

error: type mismatch; found : Egg(in lazy value scala_repl_value) where type Egg(in lazy value scala_repl_value) <: java.lang.Object with ScalaObject{lazy def mother: Chicken} required: (some other)Egg(in lazy value scala_repl_value) forSome { type (some other)Egg(in lazy value scala_repl_value) <: java.lang.Object with ScalaObject{lazy def mother: Chicken}; type Chicken <: java.lang.Object with ScalaObject{lazy def offspring: (some other)Egg(in lazy value scala_repl_value)} } object RequestResult$line16$object {

有人能解释这是怎么回事呢?

回答

4

您在breakfast函数的范围中定义了类别ChickenEgg,所以它们在外面看不到,即除breakfast之外没有人知道这些类。在斯卡拉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 
} 
+1

权,但我认为这是一个编译器的bug 2.8。 –

+0

我与你@KiptonBarros。最简单的情况,'def a = {class Local;新的本地}',工作;下一个最简单的例子,'def a = {class Local;返回新的本地},我认为它应该完全等价,不。 – Malvolio

+0

@Malvolio。结合返回类型的缺少类型推断不是一个错误,请参阅此问题以获取更多信息:[类型方法返回类型推论](http://stackoverflow.com/questions/2209179/type-in​​ference-on-method -return-type) – sschaef