2012-06-08 10 views
5

このイディオムは、階段の本の中でかなりの数回表示されます:テキストブックにいくつかのポイントをしようとしてほか"val a:A = new B"、何がポイントですか? (?)

val b:A = new B 

または

val b = new B 
val b2:A = b 

、なぜあなたが宣言したいと思います推測されるタイプのものとは異なるタイプですか?

ところで、これはどのような名前ですか?

+0

のために、私は、これは多型 – maxmc

+1

@maxmcと呼ばれていると言うだろう。しかし、オブジェクトがまだそれなしで多型だろう.. –

+0

@maxmcあなたは、これは多型性であるかを正確に手の込んだだろうか - ? pstと同様、これは多義性が意味するものではないと確信しています... –

答えて

10

私はそれがインターフェイスとのプログラミングのイディオムに似ていると主張します。

val b:A = new B 

を行うことによって、あなたはその時点の後にあなたがAによって提供されるインタフェースよりも何か他のものに頼っていないことを確認してください。つまり、b:A = new Cに変更することを決断した場合、何も破損しないことを保証します。

+0

私はそれがLiskov置換原則(http://en.wikipedia.org/wiki/Liskov_substitution_principle)と呼ばれていると信じています。 – thoredge

+3

私はそれが関連していると言うでしょうが、違うと思います。明示的に 'b 'の型を指定しても、' new B'から 'new C'に移行するときにプログラムの動作が変わらないことを保証するものではありません。リスコフの置換原理は、より概念的でより高い概念であるように思われる。 – aioobe

+1

これは_type ascription_と呼ばれます。 'b:A'を宣言することによって、' A'型を 'B'型の値に_ascribing_します。あなたは効果的に言っています。「私が考える限り、これは単なるAです。宣言を 'val b = new B:A'と書くこともできます。 –

14

それはのために役立つことができます:

  1. は、プログラマの意図記述(私はBを作成したを、私は興味のみ動作)あなたが定義されたメソッドのみを使用することを確認
  2. A.コードの多くを変更することなく、具体的な の実装を後でスワップすることができます。
  3. IDEまたは REPLを使用しているときに使用できる自動補完のリストを単純化します。
  4. 暗黙的な変換をある時点で強制します。

より複雑なインスタンス化では、推論された型が正しいものであることが保証されます。例

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) 
関連する問題