class Foo abstract class C { val f: Foo def g1 = (f == f) } object O1 extends C { val f = new Foo() def g2 = (f == f) } object O2 extends C { object f extends Foo def g2 = (f == f) } class O3 extends C { object f extends Foo def g2 = (f == f) } object Test { def main(args: Array[String]): Unit = { println(O1.g1) println(O1.g2) println(O2.g1) println(O2.g2) val o3 = new O3() println(o3.g1) println(o3.g2) } }