2015-04-17 3 views
0

У меня есть метод:Scala общие методы, которые принимают функции

private def foo(f: => Future[Any]): Future[Any] = { 
    //code, code, code 
    //function return same result as function that taken 
} 

Это хорошо работает, но мне нужно, чтобы использовать это в другой части моего проекта с различными типами, и есть некоторые ограничения. Если мне нужно вызвать какой-то метод типа, который я использую, тогда он недоступен, без кастинга.

Например:

if(foo("abacaba").containsSlice("dabacaba")){...} 

if(foo(15) > 55){...} 

Есть ли способ создать обобщенную функцию, чтобы обрабатывать все эти случаи?

+0

Как 'Future [A]' или просто какой-то общий тип 'A'? –

ответ

3

Необходимо указать, что возвращаемый тип функции, которую вы получаете (это может быть что-либо), - это тот же тип, который возвращает ваша функция.

private def foo[T](f: => Future[T]): Future[T] = { 
    //code, code, code 
    //function return same result as function that taken 
} 

Я не думаю, что это действительно нужно сказать [T <: Any] поскольку все типа Any

0

У вас уже есть это определено в библиотеке Scala как scala.Function0 Вы на самом деле есть и черты, которые определяют функции, которые получают параметры как Function1 - Function22.

Это исходный код для Function0 -

trait Function0[@specialized(Specializable.Primitives) +R] extends AnyRef { self => 
    /** Apply the body of this function to the arguments. 
    * @return the result of function application. 
    */ 
    def apply(): R 

    override def toString() = "<function0>" 
} 

Если вы хотите получить в будущее как пары можно писать очень похожую Черту для будущего.

Смежные вопросы