gpt4 book ai didi

scala - 从 Scala Set 到 Java Set 的隐式转换

转载 作者:行者123 更新时间:2023-12-04 16:06:10 24 4
gpt4 key购买 nike

我有以下内容:

    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 和类型参数为 DBar 的某个子类型,执行转换。此方法现在称为 scalaSetToJavaSet[Goo, Moo](而不是 scalaSetToJavaSet[Goo, Bar[Goo]])。


正如其他人指出的那样,使用 JavaConversions 中的现成转换比编写自己的转换更容易。

关于scala - 从 Scala Set 到 Java Set 的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19093871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com