2013-06-05 1 views
3

У меня есть класс EMCC Scala, который проходит TreeMap[Long,HashSet[DSFrame]]Использование Scala расширение неизменного класса в Java

У меня есть класс Java, в котором я пытаюсь создать EMCC и добавить новую пару ключ-значение для него. Я могу создать новый EMCC экземпляра штраф, но так как TreeMap неизменна, я не могу просто позвонить

emcc.insert(key, value) 

, но вместо этого необходимо вызвать

emcc = emcc.insert(key,value) 

Попытка скомпилировать это дает следующее сообщение об ошибке:

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

Попытка привести результат вставки к EMCC приведет к той же ошибке.

Как сделать так, чтобы эти игры хорошо сочетались?

Одна вещь, которую я замечаю, заключается в том, что она сообщает, что ключи результата являются объектами, что нечетно, потому что в этой ситуации key длинный, но я не уверен, что это связано.

+2

Я не знаю, очень хорошо Scala, но вы не можете использовать композицию вместо этого? – fge

+0

@fge: Не могли бы вы уточнить? – williamstome

+0

Имейте «TreeMap» в качестве члена экземпляра и делегируйте ему необходимые операции. – fge

ответ

2

Если вы хотите расширить свой TreeMap с помощью методов, специфичных для домена, я вижу два возможных решения.

состав

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) 

или неявные классы

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)