2016-08-03 5 views
1

私はスカラ座に新たなんだと、この宣言の理解とトラブルになった:Scalaのメソッド宣言を理解するには?

val props = Props[TestActor] 

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

はなぜ我々はこのようにそれを使用することができます:ここでは

AkkaPropsオブジェクトからの宣言です

class TestActor extends Actor。私はちょうどGeneric Type引数でどのように興味があります、コンパイラは、適切なメソッドのdefenitionを見つけることができます。どのように機能するのですか?

答えて

3

applyメソッドに関連する特別な魔法が、Scala objectにあります。この:あなたの例を見て、

同様
val something = Hello.apply() 

val something = Hello() 

は、このための特別なショートカット構文です

val props = Props[TestActor] 

は、このためだけの短い構文は次のとおりです。

val props = Props.apply[TestActor]() 

[TestActor]は、applyメソッドの型引数を入力するだけです。

+0

しかし 'ClassTag'は' T <:Actor:ClassTag'で何を意味しますか? '暗黙的に[ClassTag [T]]。runtimeClass'として使用されます。 – user3663882

+2

'ClassTag'は実行時にクラスに関する情報を保持します。 ':'は 'ClassTag'の_context bound_を定義します。これは暗黙のスコープにClassTag [T]のインスタンスがあることを意味します。それは 'def apply [T <:Actor](暗黙の証拠:ClassTag [T])'の構文的砂糖です。 「ClassTag」クラスの詳細については、次のURLを参照してください。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

関連する問題