【问题标题】:Scala generic methods that take functions接受函数的 Scala 泛型方法
【发布时间】:2015-04-17 23:59:33
【问题描述】:

我有一个方法:

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){...}

有没有办法创建通用函数来处理所有这些情况?

【问题讨论】:

  • 喜欢Future[A] 还是只是一些泛型类型A

标签: scala generics


【解决方案1】:

您需要指定您获得的函数的返回类型(可能是任何类型)与您的函数返回的类型相同。

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

我认为没有必要说[T <: Any],因为所有内容都是Any 类型的

【讨论】:

    【解决方案2】:

    您已经在 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>"
    }
    

    如果您想将 Future 作为参数,您可以为 Future 编写非常相似的 Trait。

    【讨论】:

      猜你喜欢
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多