尝试发表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 {
有人能解释一下这里发生了什么吗?
答案 0 :(得分:4)
您在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 <
当在函数之外定义的类时,一切都按预期工作
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
}