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() 方法的对象,所以第二行不会编译。

我觉得我在这里缺少一些基本的东西......

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 类型的灵活性,在这种情况下,没有比将类型别名与工厂分开更好的解决方案(这可能是一个普通的方法,不需要带有 apply 的 Object)。

于 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 回答
1

这可能是一种可能的解决方案

package object Properties {
  import scala.collection.generic.ImmutableMapFactory
  import scala.collection.immutable.HashMap

  type Properties = HashMap[String, Float]
  object Properties extends ImmutableMapFactory[Properties] {
    def empty[String, Float] = new Properties()
  }
}
于 2014-07-25T15:13:55.040 回答