2011-10-11 2 views
6

予想通り、これは動作しますが:MIXIN二回

trait A 
trait B extends A 
object C extends A with B 

以下の収率illegal cyclic reference involving trait B

package cyclictest { 
    trait A 
    trait B extends A 
} 
package object cyclictest extends A with B 
が起こっ

What's?

+1

最初にBから継承してください。コンパイラがオブジェクトの基底クラスを線形化できないことがあります。 – Dirk

+5

@Dirk、確かに、あまりにも最初にそれを考えるのは簡単です。それにもかかわらず、私はそれが目的か何らかの種類のバグかどうかまだ疑問に思っていますか? –

+0

私はあなたのパッケージオブジェクトの定義は、パッケージ自体で定義された特性を拡張することはできないと思う。スカラーの仕様では次のように書かれています: "パッケージオブジェクトは、パッケージpで定義されている 最上位のオブジェクトまたはクラスの1つと同じ名前のメンバーを定義すべきではありません。名前の矛盾がある場合、プログラムの動作は現在不確定です。 _ "私はあなたがしていることは、形質AとBを再定義することに等しいと思う –

答えて

2

エラーは正しいです。コンパイラはそう何型チェッカーが見ることで、完全修飾名に名前ABを解決します。パッケージのオブジェクト定義が正しいことを確認するために

package object cyclictest extends cyclictest.A with cyclictest.B 

、コンパイラはAのすべてのメンバーを知っている必要があるとBですが、それを知るには、のメンバーを知る必要があります(ABはメンバーであるのでcyclictestです)。しかし、これはの間に発生し、サイクレストを定義しているため、解決できないサイクルがあります。

パッケージcyclictestが何も継承しないため、最初のケースが過ぎます。これは、デフォルトのディレクトリベースのパッケージです。