Что послужило причиной для этого?
Поскольку при приеме параметра типа Any
, компилятор делает вывод, что тип Unit
применим в том случае, и, таким образом, передает Unit
типа к foo.apply
из PartialFunction
:
def main(args: Array[String]): Unit = {
val foo: PartialFunction[Any,Unit] = ({
@SerialVersionUID(value = 0) final <synthetic> class $anonfun extends scala.runtime.AbstractPartialFunction[Any,Unit] with Serializable {
def <init>(): <$anon: Any => Unit> = {
$anonfun.super.<init>();
()
};
final override def applyOrElse[A1, B1 >: Unit](x1: A1, default: A1 => B1): B1 = ((x1.asInstanceOf[Any]: Any): Any @unchecked) match {
case (s @ (_: String)) => scala.this.Predef.println(s)
case (defaultCase$ @ _) => default.apply(x1)
};
final def isDefinedAt(x1: Any): Boolean = ((x1.asInstanceOf[Any]: Any): Any @unchecked) match {
case (s @ (_: String)) => true
case (defaultCase$ @ _) => false
}
};
new $anonfun()
}: PartialFunction[Any,Unit]);
foo.apply(())
}
Если тип ограничение было более узким, то есть AnyRef
, вы увидите ошибку компилятора, так как Unit
наследует AnyVal
, и теперь компилятор не может предоставить какую-либо скрытую «помощь».