このイディオムは、階段の本の中でかなりの数回表示されます:テキストブックにいくつかのポイントをしようとしてほか"val a:A = new B"、何がポイントですか? (?)
val b:A = new B
または
val b = new B
val b2:A = b
、なぜあなたが宣言したいと思います推測されるタイプのものとは異なるタイプですか?
ところで、これはどのような名前ですか?
このイディオムは、階段の本の中でかなりの数回表示されます:テキストブックにいくつかのポイントをしようとしてほか"val a:A = new B"、何がポイントですか? (?)
val b:A = new B
または
val b = new B
val b2:A = b
、なぜあなたが宣言したいと思います推測されるタイプのものとは異なるタイプですか?
ところで、これはどのような名前ですか?
私はそれがインターフェイスとのプログラミングのイディオムに似ていると主張します。
val b:A = new B
を行うことによって、あなたはその時点の後にあなたがA
によって提供されるインタフェースよりも何か他のものに頼っていないことを確認してください。つまり、b:A = new C
に変更することを決断した場合、何も破損しないことを保証します。
私はそれがLiskov置換原則(http://en.wikipedia.org/wiki/Liskov_substitution_principle)と呼ばれていると信じています。 – thoredge
私はそれが関連していると言うでしょうが、違うと思います。明示的に 'b 'の型を指定しても、' new B'から 'new C'に移行するときにプログラムの動作が変わらないことを保証するものではありません。リスコフの置換原理は、より概念的でより高い概念であるように思われる。 – aioobe
これは_type ascription_と呼ばれます。 'b:A'を宣言することによって、' A'型を 'B'型の値に_ascribing_します。あなたは効果的に言っています。「私が考える限り、これは単なるAです。宣言を 'val b = new B:A'と書くこともできます。 –
それはのために役立つことができます:
より複雑なインスタンス化では、推論された型が正しいものであることが保証されます。例
sealed trait Answer
case object Yes extends Answer
case object No extends Answer
scala> val a = List(Yes, Yes, No)
a: List[Product with Serializable with Answer] = List(Yes, Yes, No)
scala> val b: List[Answer] = List(Yes, Yes, No)
b: List[Answer] = List(Yes, Yes, No)
のために、私は、これは多型 – maxmc
@maxmcと呼ばれていると言うだろう。しかし、オブジェクトがまだそれなしで多型だろう.. –
@maxmcあなたは、これは多型性であるかを正確に手の込んだだろうか - ? pstと同様、これは多義性が意味するものではないと確信しています... –