应用[Scala]类型中使用的方法

时间:2017-04-14 11:30:32

标签: scala apply structural-typing

我正在浏览Scala代码,并发现在type中也使用了apply方法。

例:
type Common = {
  def apply: {val func: {} => {val a: A}; val c: C} => {val b: B}
}

上述代码是什么意思?

据我了解,这意味着Common指的是包含apply方法的所有类型。但是,问题是什么样的应用方法是什么意思?应用方法的输入应该是什么?

此外,

type Common = {
  def apply({val func: {} => {val a: A}; val c: C} => {val b: B})
}

两种Common类型有什么区别?

1 个答案:

答案 0 :(得分:1)

这被称为结构类型。它只是意味着您通过其结构而不是(仅)通过其名称来描述类型。类型Foo{val a: String}表示“类型Foo但也有val a: String”的内容。 {val a: String}AnyRef{val a: String}相同。因此{}表示AnyRef{},基本上与AnyRef相同。

当然,您也可以在结构类型中使用结构类型,这是Common所做的。 Common是AnyRef的子类型,它具有apply方法,该方法不带参数,但返回带有一些复杂结构类型的函数作为类型参数。要破译那些你只需要递归地应用第一段中的规则。

您如何使用此Common类型?我建议不要,但是......

scala> :paste
// Entering paste mode (ctrl-D to finish)

class A; class B; class C

type Common = {
  def apply: {val func: {} => {val a: A}; val c: C} => {val b: B}
}

class HasA { val a = new A }

class HasB { val b = new B }

class HasC {
  val func = (a: AnyRef) => new HasA
  val c = new C
}

class MyCommon { def apply = (h: Any) => new HasB }

// Exiting paste mode, now interpreting.


scala> def common(c: Common) = c
common: (c: Common)Common

scala> common(new MyCommon)
res0: Common = MyCommon@3652a0d8

scala> res0.apply(new HasC)
res1: AnyRef{val b: B} = HasB@3925c40e

scala> res1.b
res2: B = B@1ba053df

结构类型方法的调用也可能导致运行时开销,因为它们是用反射实现的。