Utilisation de l'extension Scala de la classe immuable en Java


J'ai un Scala classe EMCC, qui s'étend TreeMap[Long,HashSet[DSFrame]]

J'ai une classe Java dans laquelle j'essaie de créer un EMCC et d'y ajouter une nouvelle paire clé-valeur. Je peux créer une nouvelle instance EMCC correctement, mais puisque TreeMap est immuable, je ne peux pas simplement appeler

emcc.insert(key, value)

, Mais doit plutôt appeler

emcc = emcc.insert(key,value)

Tenter de compiler cela donne l'erreur suivante:

error: incompatible types
[javac]             emcc = emcc.insert(key, value);
[javac]                               ^
[javac]   required: EMCC
[javac]   found:    TreeMap<Object,Set<DSFrame>>

Tenter de convertir le résultat d'insertion en un EMCC ne produit que la même erreur.

Comment faire ceux-ci jouent bien ensemble?

Une chose que je remarque est qu'il signale que les clés du résultat sont des objets, ce qui est étrange car dans cette situation key est long, mais je ne sais pas si cela est lié.

Author: williamstome, 2013-06-05

1 answers

Si vous souhaitez étendre votre TreeMap avec des méthodes spécifiques au domaine, je vois deux solutions possibles.

Composition

class EMCC(private val map: TreeMap[Long, HashSet[DSFrame]] = TreeMap.empty[Long, HashSet[DSFrame]]) {
  def insert(key: Long, value: HashSet[DSFrame]) = new EMCC(map + (key -> value))
  def foo = map.size
}
var e = new EMCC
e = e.insert(23L, HashSet.empty[DSFrame])
println(e.foo)

Ou classes implicites

type EMCC = TreeMap[Long, HashSet[DSFrame]]
implicit class EmccExt(map: EMCC) {
  def foo = map.size
}
var e = new EMCC
e = e.insert(23L, HashSet.empty[DSFrame])
println(e.foo)
 2
Author: SpiderPig, 2013-06-05 22:28:35