Это ... и то и другое.
Вы можете посмотреть, как ведет себя механизм связывания, в спецификации Scala §8.1.3.Он говорит, что в шаблоне x@p
:
тип переменной x - это статический тип T шаблона p.
В вашем случае шаблон p
- это IntValue(_) | BooleanValue(_)
.Так как IntValue
и BooleanValue
unapply-методы оба требуют String, статический тип вашего паттерна String
, таким образом, тип x
равен String
.
Во втором случае, значение извлекается из BooleanValue и имеет правильный тип.
К сожалению, scala не поддерживает альтернативные шаблоны экстракторов, поэтому вы должны придерживаться своей второй версии.