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.Bar
とMain.foo2.Bar
のパスは一致しなければなりません。これを確認するには、最終行を
turkle((new foo2.Bar {}).asInstanceOf[foo1.Bar])
に変更します。どちらもコンパイルして例外なく実行します。
Scalaは自動的にこのような推論を実行できますか?もしそうなら、どうすればいいのですか?
(そうでない場合は、この方向に型システムを拡張するためのいずれかの見通しはあるのですか?)
私は時々 Scalaはこの推論のソートを実行するように見えるんのでご注意ます。私はobject Foo
にtrait 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.Bar
とMain.foo2.Bar
の両方が本当にFoo.Bar
と同じであることを打ち出しました。
アドリアンムーアスの「経路平等」のセクション(https://groups.google.com/forum/#!msg/scala-language/8gWgzVY-Zd0/1m5VL26QZ6sJ)を見ましたが、今存在しているScalaの質問にどのように関連しているのかわかりません。 –