object A { def f0[T](x: T): T = x def f1[T](x: => T): T = x def f2[T](x: () => T): T = x() f0(this.getClass) // ok f1(this.getClass) f2(this.getClass) // ok // a.scala:7: error: type mismatch; // found : Class[_ <: A.type] // required: Class[?0(in value x1)] where type ?0(in value x1) <: A.type // Note: A.type >: ?0, but Java-defined class Class is invariant in type T. // You may wish to investigate a wildcard type such as `_ >: ?0`. (SLS 3.2.10) // val x1 = f1(this.getClass) // ^ // one error found }