Один из простых способов справиться с стиранием типов - создать непараматизированный класс.Это не идеально, но это работает.Сделайте его классом, который расширяет Function2, и это даже не слишком неуклюже, чтобы использовать либо напрямую, либо в соответствии с шаблономне после.Кроме того, вы получаете один класс для каждого конкретного типа функции.
Другое, возможно, гораздо лучшее решение - не потерять информацию о типе.Используйте Either для сохранения информации о статическом типе.
scala> val elements : List[Either[Int, (Int, Int) => Int]] = List(Left(1), Right(_ + _), Left(2))
elements: List[Either[Int,(Int, Int) => Int]] = List(Left(1), Right(<function2>), Left(2))
scala> for (a <- elements) yield a match {
| case Right(f) => f(1,2)
| case Left(x) => x
| }
res1: List[Int] = List(1, 3, 2)
Ограничение здесь состоит в том, что он становится неуклюжим, если ваш список может иметь более 2 типов.Но это эффективно предотвращает использование языка Scala в качестве динамически типизированного языка, в отличие от предыдущего решения.