作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下内容:
class Goo
trait Bar[D] {
def toD : D
}
class Moo extends Bar[Goo] {
def toD : Goo = new Goo
}
object Foo {
import scala.collection.JavaConversions._
import java.util
implicit def scalaSetToJavaSet[D](bars: Set[Bar[D]]) : util.Set[D] = bars.map(_.toD)
}
trait Zoo {
import java.util
import Foo._
var javaSet : util.Set[Goo] = Set(new Moo) //compile error
var explicitJavaSet: util.Set[Goo] = scalaSetToJavaSet(Set(new Moo)) //works!!!
}
当我尝试编译此代码时出现错误:
"error: type mismatch;
found : scala.collection.immutable.Set[Moo]
required: java.util.Set[Goo]
var javaSet : util.Set[Goo] = ***Set(new Moo)***"
显式定义编译。为什么隐式转换不起作用?
最佳答案
这确实很棘手。基本上你的想法是正确的。您定义一个导入的转换方法 scalaSetToJavaSet
。问题来自以下事实:(Scala 的) Set[A]
在其类型参数 A
中是不变的。这意味着 Set[Moo]
不是 Set[Bar[_]]
的子类型。
为了解决这个问题,您需要告诉隐式转换集合元素可以是 bar 的子类型:
implicit def scalaSetToJavaSet[D, B <: Bar[D]](bars: Set[B]): java.util.Set[D] =
bars.map(_.toD)
val javaSet: java.util.Set[Goo] = scala.Set(new Moo) // ok
您现在可以这样理解:给定类型 D
和类型参数为 D
的 Bar
的某个子类型,执行转换。此方法现在称为 scalaSetToJavaSet[Goo, Moo]
(而不是 scalaSetToJavaSet[Goo, Bar[Goo]]
)。
正如其他人指出的那样,使用 JavaConversions
中的现成转换比编写自己的转换更容易。
关于scala - 从 Scala Set 到 Java Set 的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19093871/
我是一名优秀的程序员,十分优秀!