2016-08-03 87 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