У меня нет объяснения, но есть более короткий пример, который, я надеюсь, точно определит место возникновения проблемы.Я думаю, что это вообще не связано ни с исключениями, ни с отражением.Является ли это поведение загадочным, но правильным следствием спецификации или ошибкой, я понятия не имею.
val untypedList : List[_] = List("a", "b")
val typedList : List[String] = List("a", "b")
def uselessByName[A](a: => A) = a
def uselessByValue[A](a: A) = a
uselessByName(untypedList)
завершается с той же ошибкой, что и ваш код.Других комбинаций нет.Таким образом, комбинация метода с универсальным аргументом call-by-name вызывается с помощью универсального параметра с экзистенциальным типом.
uselessByName[List[_]](untypedList)
работает, так что я думаю, что если вы вызовете явно opt[Constructor[_]]
, это тоже может сработать.