Существует множество подходов, которые могут сработать, но ни один из них не так прост.
Один из вариантов - использовать манифесты, но вам придется определить свой собственный вариант соответствия, который был манифестом.осознанный.Вы можете прочитать больше о манифестах здесь .Если вам придется много делать такого рода вещи, то это будет путь, хотя эта функция все еще считается экспериментальной.
Другой вариант, если вы используете относительно легковес, - это обернутьфункция в некотором классе, который не является общим.Например,
object Example {
def hasString(a:Any) = (a!=null && a.toString.length>0)
case class AnyImpliesBoolean(f: (Any) => Boolean) { }
implicit def callAIB(aib: AnyImpliesBoolean) = aib.f
def callWrapped(a: Any) {
a match {
case aib: AnyImpliesBoolean => println( aib("Check") )
case _ => println("(Nothing)")
}
}
def tryMe() {
val has = AnyImpliesBoolean(hasString _)
callWrapped( has )
callWrapped("foo")
callWrapped((s:String)=>true)
}
}
scala> Example.tryMe
true
(Nothing)
(Nothing)
Если вы упаковываете несколько различных функций, но не слишком много из них, вы можете создать базовый класс WrappedFunction, а затем иметь такие вещи, как AnyImpliesBoolean extension WrappedFunction.
Покадругой вариант - на самом деле не передавать функции, а использовать отражение для передачи java.lang.Methods.Методы знают свои типы.Даже с некоторыми симпатичными оболочками Scala, это все равно будет немного неуклюжим (и не высокопроизводительным).
(Отредактировано, чтобы добавить ссылку на манифест, которую я пропустил.)