1

次の定義があると仮定します。

scala> trait T
defined trait T

scala> object A extends T
defined module A

次に、次のタイプのオブジェクトを作成できますT

scala> val t: T = A
t: T = A$@98b13b

ここではキーワードが使用されていないnewため、ここではapplyメソッドが使用されます。applyしかし、これまでメソッドを定義していなかったので、applyここではデフォルトのメソッドが使用されていると思いますか?しかし、それはどのように見えますか?

更新1:

同じタイプの変数を割り当てるAと、エラーがスローされます。

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

同じ「トリック」がここで機能しないのはなぜですか?違いはなんですか ?

4

2 に答える 2

9

Aはでありobject、ではないclassため、インスタンスを作成する必要はありません。基本的にはシングルトンです。したがって、必要ありませnewん。applyここでは関与していません。

case classesとは少し異なります。

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

今回はnew演算子も使用されませんでしたが、新しいオブジェクトが作成されました-そして今回apply()は関係しています。基本的に、を作成するcase classと、コンパニオンオブジェクトも作成されapply、便利なメソッドが実装されます(関数が期待される場所でのコンストラクターの使用を参照)。

val c = C.apply(10)
于 2012-07-09T07:41:39.067 に答える
4

オブジェクトAはタイプではないため、タイプアクリプションで使用することはできません。

val a: T = A

val a: A.type = A

仕事。

TAは、継承されたことがわかっている特性の拡張タイプでA.typeあり、シングルトンの狭タイプですobject

于 2012-07-09T08:24:48.393 に答える