2012-01-27 10 views
1

を拡張する際にトレイトですでに定義された変数を再定義する必要がありますコンパイルエラーが発生します。のはなぜScalaの

+0

オーバーライドを書かないでください。var printInstruction = "System.out.print(arg0);"?あなたはJavaCompilerのプロパティをオーバーライドしています – dmitry

+0

'printInstruction'は抽象的であるため、必須ではありません。' 'override'modifierなしで定義できます。 'override'を追加するのは良い方法であると考えている人もいます。 – Nicolas

答えて

8

形質をCompilerで初期化しないためです。 Compileを拡張する人は、が変数のように動作する何かをと定義することを期待しています。例えば

次が有効である:

class Example extends Compiler { 

    var _printInstruction = "foo" 

    def pritnInstruction = "I don't care about setter" 

    def pritnInstruction_=(pi: String) = _printInstruction = pi 
} 

あなたは

class JavaCompiler extends Compiler { 
    printInstruction = "System.out.print(arg0);" 
} 

を使用することができるようにしたい場合は、CompilerトレイトであなたのVARを初期化:

trait Compiler { 
    var printInstruction: String = _ 
} 
+0

私はこの質問の著者ではありませんが、何か説明をお願いしますか? 'var printInstruction:String = _'のアンダースコアはどういう意味ですか? – dmitry

+1

_は、変数の型に応じてデフォルト値で変数を初期化することを意味します。var x:Int = _はx = 0につながります。 'var y:String = _'はy = nullになり、以下同様です。 javaでの暗黙の初期化と同じです。ほとんどの場合、悪い習慣です。 – Nicolas

+0

varがデフォルト値なしで定義されているとき、なぜエラーが発生しましたか?抽象的/未実装として扱われましたか? – dmitry

0

のオーバーライドvarsは一般的にあなたがしたいことではありません。あなたはvarようを振る舞う何かをしたい、とさえするものであってもよい場合は、次の操作を行います。

trait Compiler { 
    def printInstruction: String 
    def printInstruction_=(s: String): Unit 
} 

class JavaCompiler { 
    var printInstructions = "System.out.print(arg0);" 
} 

はどういうわけか、私はそれはあなたが意図したものだとは思いません。だからあなたが実際に達成しようとしていることを説明しないでください。

+0

そのスピンはhttp://stackoverflow.com/questions/9033253/is-this-the-正確な変換方法 - Java-interface-into-scala/9034680#9034680そこには、元の問題に対する最良の解決策があります。これはコンパイラが未定義のままにしておくと、私のためにvarを定義することを選択しなかった理由の単なる質問でした。 – Farmor

関連する問題