Объясните это несоответствие типов в ленивой оценке - PullRequest
4 голосов
/ 22 сентября 2011

Пытаясь заполучить этот комментарий, я написал следующий код:

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 компилятор) умирает ужасной смертью:

ошибка: несоответствие типов;Найдено: Яйцо (в ленивом значении scala_repl_value), где тип Яйцо (в ленивом значении scala_repl_value) <: java.lang.Object с ScalaObject {ленивый def mother: Chicken} требуется: (некоторые другие) Яйцо (в ленивом значении scala_repl_value) forSome {тип(некоторые другие) Яйцо (в ленивом значении scala_repl_value) <: java.lang.Object with ScalaObject {lazy def mother: Chicken};тип Chicken <: java.lang.Object с ScalaObject {потомство отложенного определения: (некоторые другие) яйцо (с ленивым значением scala_repl_value)}} объект RequestResult $ line16 $ object {</p>

Может кто-нибудь объяснить, что происходитздесь?

1 Ответ

4 голосов
/ 22 сентября 2011

Вы определяете классы Chicken и Egg в области действия функции breakfast, поэтому они не видны снаружи, т.е. никто, кроме breakfast, не знает этих классов.В Scala 2.9 этот фрагмент фактически работает, и возвращаемое значение функции breakfast определяется как

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

Когда классы определены вне функции, все работает как положено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...