Ответ 1
Если вы скомпилируете этот код с помощью scalac -print
, вы увидите, что происходит. Как вы правильно предположили, это просто синтаксический сахар для соответствия шаблону. На самом деле ваш класс case расширяет Product, который также является суперклассом Tuple2, и это ваш код компилируется. Ваше значение присваивается переменной типа Product:
val temp6: Product = if (value)
new Main$Pair("foo", "bar")
else
new Tuple2("foo", "bar");
И затем к нему применяется сопоставление шаблонов:
if (temp6.$isInstanceOf[Main$Pair]())
{
<synthetic> val temp7: Main$Pair = temp6.$asInstanceOf[Main$Pair]();
new Tuple2(temp7.x(), temp7.y())
}
else
throw new MatchError(temp6)
Но, тем не менее, это не должно компилировать imho. Вы должны отправить его в список рассылки scala.