什么是Scala中的apply方法,尤其是在类型定义

时间:2017-04-13 09:46:38

标签: scala generics apply

我知道apply方法在伴侣对象中使用时是语法糖。 但是,如何在类型定义中使用apply方法,如下所示?

type Applyn = {
    def apply[A](f: A=>A, n: Int, x: A): A
}

这句话之间是否存在差异? 我猜这个句子用于将通用函数值赋给Applyn。

例如,通过使用上面的句子,我们可以制作

(Int=>Int, Int, Int)=>Int

(String=>String, Int, String)=>String

等,只有一种Applyn

这是对的吗?

1 个答案:

答案 0 :(得分:1)

您正在寻找的是结构类型。它没有引用任何特定类型,但任何具有方法apply[A](f: A=>A, n: Int, x: A): A的类型。函数具有apply方法,因此适用具有正确签名的函数,但也可以创建具有不是函数的apply方法的类型。想象一下。

object NotAFunction {
  def apply[A](f: A=>A, n: Int, x: A): A = {...}
}

这个对象没有扩展Function,所以它不是一个函数,但它仍然满足结构类型的要求。

结构类型提供了一个很好的语法,但它们非常慢,因此应尽可能避免使用它们,尤其是在性能关键代码中。