2011-09-22 84 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