我无法将java SortedMap转换为scala TreeMap。 SortedMap来自反序列化,需要在使用之前转换为scala结构。Java SortedMap到Scala TreeMap
对于好奇的一些背景是,序列化结构是通过XStream写入的,在去绝缘的情况下,我注册了一个转换器,该转换器指出任何可以分配给SortedMap[Comparable[_],_]
的东西都应该给我。所以我的转换方法被调用,并给予我可以安全投射的Object
,因为我知道它是SortedMap[Comparable[_],_]
类型。这就是它变得有趣的地方。这里有一些示例代码可能有助于解释它。
// a conversion from comparable to ordering
scala> implicit def comparable2ordering[A <: Comparable[A]](x: A): Ordering[A] = new Ordering[A] {
| def compare(x: A, y: A) = x.compareTo(y)
| }
comparable2ordering: [A <: java.lang.Comparable[A]](x: A)Ordering[A]
// jm is how I see the map in the converter. Just as an object. I know the key
// is of type Comparable[_]
scala> val jm : Object = new java.util.TreeMap[Comparable[_], String]()
jm: java.lang.Object = {}
// It's safe to cast as the converter only gets called for SortedMap[Comparable[_],_]
scala> val b = jm.asInstanceOf[java.util.SortedMap[Comparable[_],_]]
b: java.util.SortedMap[java.lang.Comparable[_], _] = {}
// Now I want to convert this to a tree map
scala> collection.immutable.TreeMap() ++ (for(k <- b.keySet) yield { (k, b.get(k)) })
<console>:15: error: diverging implicit expansion for type Ordering[A]
starting with method Tuple9 in object Ordering
collection.immutable.TreeMap() ++ (for(k <- b.keySet) yield { (k, b.get(k)) })
怎么样两个可比较物应该让自己订购?我不太明白。键应该在TreeMap中排序。他们的键是Comparable [_]。所以你需要订购可比公司。所以你需要一个Ordering [Comparable [_]]。 – 2010-01-29 18:54:26