2012-10-15 8 views
6

私が学んだ限り、Scalaの特性は、メソッドが実装を持つことを許されている点を除けば、Javaのインタフェースに似ています。また、Scalaクラスとは異なり、構築のために引数を渡すことはできません。なぜ形質をインスタンス化できますか?

これまでのところ、とても良いです。しかし、なぜ私はそれらをインスタンス化することができますか?本当に、私はこれを許す正当な理由は見当たりません。

+1

Java: 'インタフェースバー{};バーバー=新しいバー(){}; ' – soc

答えて

22

実際にインスタンス化するわけではありません。 Javaと並行して作業を進めていくうちに、さらに進んでみましょう。あなたは抽象クラスまたはインタフェースからAnonymousクラスを構築することができます。これはScalaでほぼ同じである:

scala> trait A 
defined trait A 

scala> new A {} 
res0: A = [email protected] 

メモ特性からオブジェクトを作成するときに、中括弧が必須あること。例えば、ヨンは行うことはできません。

scala> new A 
<console>:9: error: trait A is abstract; cannot be instantiated 
       new A 
      ^

を、それがクラスに完璧に動作だろうが:あなたの特性におけるいくつかの要素が実装されていない場合はもちろん

scala> class B 
defined class B 

scala> new B 
res2: B = [email protected] 

を、あなたが作成するときにそれらを実装する必要がありますオブジェクト:

scala> trait C {def foo: Int} 
defined trait C 

scala> new C {} 
<console>:9: error: object creation impossible, since method foo in trait C of type => Int is not defined 
       new C {} 
       ^

scala> new C {def foo = 42} 
res4: C = [email protected] 
+0

+1 Thx、それはいくつかの光を出しました:-)。 – helpermethod

+4

Javaと比較するには: 'new A {}'と書くと、特性Aを拡張する匿名クラスが作成されます。 '{}'は(Javaの匿名の内部クラスのように)匿名クラスの本体です。 – Jesper

+0

'new A {}'は 'Aを持つ新しいオブジェクト 'と同じものです – sourcedelica

関連する問題