Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用不可变类的Scala扩展_Java_Scala_Inheritance_Casting_Scala Java Interop - Fatal编程技术网

在Java中使用不可变类的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]

我有一个Scala类
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