2016-09-27 3 views
0

私はこの小さなScalaサンプルを作成し、より良い特性を理解しました。Scala Traitsはどのように動作しますか?

trait Writer { 
    def write(value: Int): Unit = { 
    print("Writer") 
    } 
} 

trait Hdd extends Writer { 
    override def write(value: Int): Unit = { 
    print("Hdd") 
    } 
} 

trait File extends Writer { 
    override def write(value: Int): Unit = { 
    print("File") 
    } 
} 

class TestClass extends App { 
    (1) val myWriter = new Writer with Hdd // This line looks fine 
    (2) val myNewWriter = new Writer   // This line fail 
} 

私の理解では、Traitをインスタンス化することはできません。このため、line(2)は失敗しています。

私が理解できない何らかの理由で、ライン(1)がうまく見えます。

これはどのように可能ですか?

答えて

6

はい、あなたは形質がインスタンス化することはできませんScala.Aトレイトでインスタンス化することができないことを右ですインスタンス化のためのクラスが必要で、 "Hddの新しいライター"を使用すると、匿名クラスが作成されるため、インスタンシエーションは正常に行われ、エラーは発生しません.2行目のエラーはそのままですしたがって形質はインスタンス化できません。

+0

よろしくお願いします –

1

試してみてください。

val myWriter = new Writer {} 

私はその実装が空の場合でも、それは実装が必要と推測

+0

{}を追加すると、匿名クラスが作成されます。インスタンスのインスタンス化は機能します。 – Sakalya

関連する問題