2016-08-03 88 views
1

我是新來的Scala和陷入麻煩與理解這個聲明:如何理解Scala的方法聲明?

下面是AkkaProps對象聲明:

def apply[T <: Actor: ClassTag](): Props = __THE_DEFENITION_GOES_HERE__ 

我們爲什麼可以這樣使用它:

val props = Props[TestActor] 

其中class TestActor extends Actor。我很好奇如何通過Generic Type的說法,編譯器能夠找到適當的方法defenition。它是如何工作的?

回答

3

在Scala object中涉及apply方法有一些特殊的魔法。這:

val something = Hello() 

是特殊的快捷語法如下:

val something = Hello.apply() 

同樣,看你的例子:

val props = Props[TestActor] 

是這只是短暫的語法:

val props = Props.apply[TestActor]() 

The [TestActor]只是填充apply方法的類型參數。

+0

但是'T <:Actor:ClassTag'中的'ClassTag'是什麼意思?它使用'隱式[ClassTag [T]]。runtimeClass'。 – user3663882

+2

'ClassTag'在運行時攜帶關於類的信息。 ':'在'ClassTag'上定義了一個_context bound_,意思是「在隱式範圍內有一個ClassTag [T]」的實例;它是'def apply [T <:Actor](隱式證據:ClassTag [T])'的語法糖。 有關'ClassTag'類的更多信息,可以閱讀:http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html 有關上下文邊界的具體信息,請參見:http: //docs.scala-lang.org/tutorials/FAQ/context-and-view-bounds.html#what-is-a-context-bound – stefanobaghino

+0

@ user3663882「ClassTag」是一種解決類型擦除的方法JVM。 – Jesper