2017-04-14 153 views
1

中使用的方法我正在浏览斯卡拉代码,并发现应用方法也用于type使用类型[斯卡拉]

例子:
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}) 
} 

是哪两个普通型的区别?

+0

区别在于第二个是无效的语法。 –

+0

那么,第一个是什么意思?该应用方法的输入是什么? – kong0329

回答

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 = [email protected] 

scala> res0.apply(new HasC) 
res1: AnyRef{val b: B} = [email protected] 

scala> res1.b 
res2: B = [email protected] 

的调用也可能招致运行时开销,因为它们与反射来实现。

+0

你能解释一下上面的应用方法吗? – kong0329