在Java中使用不可变类的Scala扩展
我有一个Scala类在Java中使用不可变类的Scala扩展,java,scala,inheritance,casting,scala-java-interop,Java,Scala,Inheritance,Casting,Scala Java Interop,我有一个Scala类EMCC,它扩展了TreeMap[Long,HashSet[DSFrame]] 我有一个Java类,试图在其中创建一个EMCC,并向其添加一个新的键值对。我可以创建一个新的EMCC实例,但由于TreeMap是不可变的,所以我不能简单地调用 emcc.insert(key, value) 但我们必须打电话 emcc = emcc.insert(key,value) 试图编译此文件会产生以下错误: error: incompatible types [javac]
EMCC
,它扩展了TreeMap[Long,HashSet[DSFrame]]
我有一个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>>
错误:不兼容的类型
[javac]emcc=emcc.insert(键,值);
[javac]^
[javac]必需:EMCC
[javac]找到:TreeMap
尝试将插入结果强制转换为EMCC只会产生相同的错误
我怎样才能让它们配合得很好
我注意到的一点是,它报告结果的键是对象,这很奇怪,因为在这种情况下,
键
是一个长键,但我不确定这是否相关。如果您想用特定于域的方法扩展树状图,我看到两种可能的解决方案
构图
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)
我对scala不太了解,但你不能改用composition吗?@fge:你能详细说明一下吗?将
TreeMap
作为实例成员,并将所需的操作委托给它。我可以,但我认为用特定于域的方法扩展TreeMap比将map及其方法包装到另一个类中更干净。我可能错了。嗯,扩展集合
是非常危险的。例如,您不知道重写.add()
是否会对.addAll()
产生影响。因此,我相信在JDK中,Collection
或派生的所有具体实现都是final
。