2011-12-22 4 views
4

Scalaでは、パスに依存する型に関連する型の不一致があることがわかりますが、実際に型が一致するのは簡単に理由があります。ここでは簡単な例です:Scalaはパス依存型間のアイデンティティに気付くことができますか?

与え
trait Foo { trait Bar } 

object Main extends App { 
    val foo1 = new Foo { } 
    val foo2 = foo1 

    def turkle(x: foo1.Bar) {} 

    turkle(new foo2.Bar {}) 
} 

: "型の不一致を、見つけ:Main.foo2.Barとjava.lang.Object上位を必要:Main.foo1.Barを"。

もちろん、val foo2 = foo1と書いたので、Main.foo1.BarMain.foo2.Barのパスは一致しなければなりません。これを確認するには、最終行を

turkle((new foo2.Bar {}).asInstanceOf[foo1.Bar]) 

に変更します。どちらもコンパイルして例外なく実行します。

Scalaは自動的にこのような推論を実行できますか?もしそうなら、どうすればいいのですか?

(そうでない場合は、この方向に型システムを拡張するためのいずれかの見通しはあるのですか?)

私は時々 Scalaはこの推論のソートを実行するように見えるんのでご注意ます。私はobject Footrait Fooを変更すると仮定すると:

object Foo { trait Bar } 

object Main extends App { 
    val foo1 = Foo 
    val foo2 = foo1 

    def turkle(x: foo1.Bar) {} 

    turkle(new foo2.Bar {}) 
} 

今、すべてが正常にコンパイルされます。何とかScalaはMain.foo1.BarMain.foo2.Barの両方が本当にFoo.Barと同じであることを打ち出しました。

+0

アドリアンムーアスの「経路平等」のセクション(https://groups.google.com/forum/#!msg/scala-language/8gWgzVY-Zd0/1m5VL26QZ6sJ)を見ましたが、今存在しているScalaの質問にどのように関連しているのかわかりません。 –

答えて

5

最近の質問では、Iulian Dragosはthe answer you needとなりました。短いバージョンは、コンパイラがフロー解析をしないということです。最初の例では、foo1とfoo2はちょうどFoo型なので、foo1.Barとfoo2.Barは同じ型です。しかし、2番目の例では、foo1はシングルトンタイプのFoo.type(Fooのサブタイプ)であると推定されます。

あなたはfoo1はシングルトンのタイプとしてfoo2は宣言することで、あなたの最初の例の作業を行うことができます参照のためのScala言語仕様2.9の

val foo2:foo1.type = foo1 

を参照してくださいセクション3.2.1。

関連する問題