7

Map[String, Float] を使用するコードがたくさんあります。だからやりたい

type DocumentVector = Map[String, Float]
...
var vec = new DocumentVector

しかし、これはコンパイルされません。メッセージが表示されます:

trait Map is abstract; cannot be instantiated
[error]       var vec = new DocumentVector

わかりました、ここで何が起こっているのか理解できたと思います。Map は具象クラスではなく、() を介してオブジェクトを生成するだけです。だから私はできる:

object DocumentVector { def apply() = { Map[String, Float]() } }
...
var vec = DocumentVector()

少しぎこちなくても、それはうまくいきます。しかし、今は型を入れ子にしたいと思っています。私は書きたい:

type DocumentVector = Map[String, Float]
type DocumentSetVectors = Map[DocumentID, DocumentVector]

しかし、これは同じ「インスタンス化できない」問題を引き起こします。だから私は試すことができます:

object DocumentVector { def apply() = { Map[String, Float]() } }
object DocumentSetVectors { def apply() = { Map[DocumentID, DocumentVector]() } }

しかし、DocumentVector は実際には型ではなく、apply() メソッドを持つ単なるオブジェクトであるため、2 行目はコンパイルされません。

ここで基本的な何かが欠けているように感じます...

4

4 に答える 4

9

必要なマップの種類を具体的に指定してください

scala> type DocumentVector = scala.collection.immutable.HashMap[String,Float]
defined type alias DocumentVector

scala> new DocumentVector                                                    
res0: scala.collection.immutable.HashMap[String,Float] = Map()

抽象 Map 型の柔軟性が必要な場合を除き、型エイリアスをファクトリから分離するよりも良い解決策はありません (これは単純なメソッドである可能性があり、適用するオブジェクトは必要ありません)。

于 2012-07-12T20:01:48.403 に答える
7

私は@missingfaktorに同意しますが、コンパニオンで特性を使用するように感じるように、少し異なる方法で実装します:

type DocumentVector = Map[String, Float]
val DocumentVector = Map[String, Float] _

// Exiting paste mode, now interpreting.

defined type alias DocumentVector
DocumentVector: (String, Float)* => scala.collection.immutable.Map[String,Float] = <function1>

scala> val x: DocumentVector = DocumentVector("" -> 2.0f)
x: DocumentVector = Map("" -> 2.0)
于 2012-07-13T08:17:26.480 に答える
3

単純な方法はどうですか?

type DocumentVector = Map[String, Float]
def newDocumentVector = Map[String, Float]()
type DocumentSetVectors = Map[DocumentID, DocumentVector]
def newDocumentSetVectors = Map[DocumentID, DocumentVector]() 
于 2012-07-12T20:05:32.557 に答える