2011-12-24 5 views
6

はScalaで微細コンパイル次のコードScalaのthis.apply(_)で「apply」を省略できないのはなぜですか?

trait Example { 
    type O 
    def apply(o: O) 
    def f(o: O) = this.apply(o) 
} 

を観察します。私はいつものようにapplyを残して、def f(o: O) = this(o)と書くことができると思います。ただし、エキサイティングなエラーメッセージが表示されます。

type mismatch; found : o.type (with underlying type Example.this.O) 
       required: _31.O where val _31: Example 
possible cause: missing arguments for method or constructor 

何が起こっているのですか?

答えて

4

回答が間違っています。あなたは、実際の問題は、これは罰金コンパイルという事実から何であるかを推測することができます。

trait Example { 
    def apply(o: String): String = o 
    def f(o: String) = this(o) 
} 

この(...)呼び出しサイトは、補助コンストラクタである場合にのみ、コンストラクタの呼び出しを表します。残りの時間は、あなたが想像したように、適用の呼び出しです。

+0

申し訳ありませんが、私は実際の問題は何かを推測することに失敗していますが、私はあなたのポイントを見ます。さらに説明できますか? –

+0

抽象型のバグです。コンパイルされていない例は、タイプOを具体的にする(例えば "タイプO =文字列")か、タイプパラメータ(例えば "特性例[O]")にした場合に機能することに注意してください。 – extempore

+0

このバグの番号を発行しますか? –

11

あなたは、コンストラクタ内部この()がこのオブジェクトのコンストラクタの呼び出し(どこにもこの()コンパイルの失敗を生成)であることができないためと適用()呼び出しにすることができませんそれはコンストラクタを隠し、オブジェクト内の別のコンストラクタを呼び出すことができなくなるためです。 this(args)は常にコンストラクタメソッド(JavaとScalaの両方)を呼び出すため、独自のオブジェクトの内部では常にapply(args)を明示的に呼び出す必要があります。

+0

Huh!もちろん、ありがとう。これについては混乱していました。私の例では 'this 'のエイリアスがありました(例えば' trait Example {f => ...} ')、何らかの理由で' f(o) 'がコンストラクタ。 –

関連する問題