2016-04-29 10 views
0

とデフ上書き揮発性タイプヴァル私はこだわっているが、Scalaのを理解しようとするには、次のことを許可していません:スカラ:不揮発性

trait WhatsWrong { 
    type Foo 

    trait HasFoo { 
    def foo: Foo 
    } 

    type Foo2 = Foo with HasFoo2 

    trait HasFoo2 extends HasFoo { 
    override val foo: Foo2 // <-- error here 
// override def foo: Foo2 // <-- this works though 
    } 
} 

Error: overriding method foo in trait HasFoo of type => WhatsWrong.this.Foo; value foo has a volatile type; cannot override a member with non-volatile type
override val foo: WhatsWrong.this.Foo2

Foo2は揮発性タイプであるのはなぜ?

答えて

1

Foo2http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#volatile-typesに係る不揮発性である:第二ケースが成り立つ:T1が抽象であり、かつT2は抽象型部材に寄与するとFoo2 = T1 with T2を。

このエラーメッセージは、volatile型の不揮発性タイプをオーバーライドすると常に発生します。Fooは不揮発性です(1.3-3のいずれも適用されないため)。だから、エラーが離れて行く作るために、いくつかの方法があります。

  • HasFoo.fooの戻り値の型が揮発します。これは、Fooの代わりにFoo with Foo(3.6.1に準拠)を使用することによって行うことができます。私はそれ以外ではFoo with FooとちょうどFooの間に違いがないと思います。

    trait WhatsWrong { 
        type Foo 
    
        trait HasFoo { 
        def foo: Foo with Foo 
        } 
    
        type Foo2 = Foo with HasFoo2 
    
        trait HasFoo2 extends HasFoo { 
        override val foo: Foo2 // <-- hey, now this works :) 
        // override def foo: Foo2 // <-- this works, too 
        } 
    } 
    
  • HMは、私が@uncheckedStable(http://www.scala-lang.org/files/archive/spec/2.11/11-annotations.html#scala-compiler-annotationsを参照)で可能なものがあるだろうと思ったが、これはそうではないようです::だから次のコードはコンパイル@annotationsと揮発性値を注釈します。 unchecked.uncheckedStableは役に立ちません。

+0

私はあなたがタイプミスがあると思います: "Foo ~~ 2 ~~は不揮発性です(1.3-3のどれも適用されないため)"。そうでなければ正しく見えます、ありがとう! – eprst

+0

はい、あなたは正当な理由があります –

1

私はこれまでに、valとdefのような抽象的な(まだ定義されていない)アクセサの動的性質に関連しています。この場合、valの代わりにdefを使うだけでコンパイルできます。

trait HasFoo2 extends HasFoo { 
    override def foo: Foo2 // <-- error here 
    // override def foo: Foo2 // <-- this works though 
    } 
+0

ああ申し訳ありませんが、あなたは既にその解決策を記載しています。 – LaloInDublin

関連する問題