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



我正在浏览 Scala 代码,发现 apply 方法也用于type

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

上面的代码是什么意思?

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

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

两种常见类型有什么区别?

这称为结构类型。它只是意味着您通过其结构而不是(仅(通过其名称来描述类型。类型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

对结构类型方法的调用也可能会产生运行时开销,因为它们是通过反射实现的。

最新更新