2012-07-09 188 views
1

假設,我們有如下定義:什麼是`object`的默認`apply`方法?

scala> trait T 
defined trait T 

scala> object A extends T 
defined module A 

然後,我們可以創建一個對象與類型T

scala> val t: T = A 
t: T = [email protected] 

沒有new關鍵字用在這裏,因此,因此在這裏使用的apply方法。 但是到目前爲止我們沒有定義apply方法,所以我猜這裏使用的默認方法是apply?但它是什麼樣子?

更新1:

在分配A類型具有相同的變量,錯誤將被拋出:

scala> val a: A = A 
<console>:9: error: not found: type A 
     val a: A = A 
      ^

爲什麼相同的「把戲」不是在這裏工作?有什麼不同 ?

回答

9

Aobject,而不是class,因此您不需要創建它的一個實例 - 它基本上是一個單例。因此不需要new。此處不包含apply

這是一個與case class ES有點不同:

case class C(x: Int) 
val c = C(10) 

這次new運營商不使用很好,但在創建新的對象 - 這一次apply()參與。基本上,當你創建一個case class,同伴對象被創建,以及爲您的舒適實施apply方法(參見:Using constructor where function expected):

val c = C.apply(10) 
+0

謝謝。當我理解你的時候,'A'的(單例)對象已經是一個完整的對象。但在另一個示例中(請參閱Update 1),將對象'A'用作普通對象時會引發錯誤。這背後的原因是什麼? – 2012-07-09 08:16:18

+0

@JohnThreepwood:這在技術上是一個單獨的問題,但無論如何。由於'A'是一個對象(認爲是singleton),所以創建它的變量或將它作爲參數傳遞是沒有意義的(參見:def foo(a:A)')。您只需使用'A'即可訪問它。 – 2012-07-09 08:30:44

4

你的對象A是不是一個類型的,所以你不能在類型歸屬使用。

val a: T = A 

val a: A.type = A 

工作。

T是你知道的A繼承的性狀的擴大類型,A.type是單身人士的窄型object

+0

謝謝,現在我承諾。你知道我在哪裏可以找到更多關於'A.type'的信息嗎?這對我來說是新的。 – 2012-07-09 08:41:56

+0

@JohnThreepwood沒什麼大不了的。 'A.type'是單身類型。如果我做'val a =「abc」; val b:a.type = a',我說'b'不是簡單的'String',但它實際上與'a'完全相同。有時候這很有用。如果您需要更多信息,請提出另一個問題。免費! :-) – 2012-07-09 21:12:54

相關問題