2011-09-15 12 views
2

便宜上、明快さと抽象化のために、パラメータ化されたコレクション特性の特定のバインディングの別の名前を作りたいと思います。たとえば、最初の考慮:Scala:コレクション型パラメータの便利なバインディング

import collection.mutable.Map // NB: Map is a trait 
val m1 = Map[String, Int]() // uses the Map companion object to create a HashMap 

は今、私はMap[String, Int]ためMyMapを代用します。理想的には私は同じように何かをしたいと思います:

trait MyMap extends Map[String, Int] 
object MyMap extends Map[String, Int] // not good enough by itself, need some apply defs 
val m2 = MyMap()      // nope 

私はMyMapコンパニオンオブジェクトに多くのものを追加することができ、または私はHashMap[String, Int]を拡張し、地図のコンパニオンオブジェクト内の不履行魔法に頼ることを忘れるMYMAP作ることができます。

しかし、これらの選択肢はシンプルであるべき何かのためにあまりにも多くの仕事のように思える:私はちょうどそれがどこに現れてもMyMapMap[String, Int]のように行動したいと思います。それを行う最も簡単な方法は何ですか、それとももっと深い原則が欠けていますか?

答えて

4

タイプの別名を使用します

type MyMap = Map[String, Int] 

注これはあなたにobject MyMapを与えることはありませんが、あなたはそれを定義した場合、それはないコンパニオンオブジェクト(object Mapがある)で、コンパイラがチェックされませんそれは暗黙の変換のためです。

+0

あなたは、ファクトリメソッドへの容易なアクセスを得ることができます(つまり)(適用。)再び、それは、単にコンパニオンオブジェクトではありません 'valのマイマップ= Map.apply [文字列、INT] _'けど、と単一の機能。 –

+1

'val MyMap = Map'はあなたにコンパニオンを与えます。 –

+0

'val MyMap = Map'は' Map [String、Int] 'のコンパニオンを私に与えてくれません。 –

0

@Alexey Romanov タイプエイリアスはファクトリメソッドを提供しません。一方では輸入が行われます。

scala> import collection.mutable.{Map => MyMap} 
scala> val m1 = MyMap() 
m1: scala.collection.mutable.Map[Nothing, Nothing] = Map() 
+1

Umですが、インポートでは、 'Map [String、Int]'ではなく、 'MyMap'を' Map'の別の名前にしています。 –

関連する問題