Если вы поделите свою проблему на подзадачи, вам будет проще найти более идиоматическую версию.Вы хотите
- найти все экземпляры
T
в вашем Iterable[Any]
- и привести их к
T
, чтобы компилятор был доволен - найти первыйсоответствующий элемент
Для первого пункта вы можете легко использовать метод filter
для Iterator
.Таким образом, у вас есть
it.iterator.filter(x => clazz.isInstance(x))
, который возвращает вам Iterator[Any]
, который содержит только T
с.Теперь давайте убедим компилятор:
it.iterator.filter(x => clazz.isInstance(x)).map(x => x.asInstanceOf[T])
Хорошо, теперь у вас есть Iterator[T]
- так что вам просто нужно найти первый элемент, выполняющий ваш предикат:
def findMatch[T](it: Iterable[Any], clazz: Class[T], pred: T => Boolean): Option[T] =
it.iterator.filter(x => clazz.isInstance(x))
.map(x => x.asInstanceOf[T])
.find(pred)