【发布时间】:2019-02-02 16:55:07
【问题描述】:
我试图定义一个结构类型,它与具有泛型类型的实例匹配。就像在这个示例代码中一样:
class ExampleTest extends FlatSpec with Matchers {
def add[T](container: {def add(s: T): Boolean})(element: T): Unit = {
container.add(element)
}
val set = new java.util.HashSet[String]()
add(set)("3")
set.contains("3") shouldEqual true
val list = new java.util.LinkedList[String]()
add(list)("3")
list.contains("3") shouldEqual true
}
但我得到一个编译错误:
Parameter type in structural refinement may not refer to an abstract type defined outside that refinement
def add[T](container: {def add(s: T): Boolean})(element: T): Unit = {
当我摆脱方法中的泛型类型并编写如下代码时:
class ExampleTest extends FlatSpec with Matchers {
def add(container: {def add(s: String): Boolean}): Unit = {
container.add("3")
}
val set = new java.util.HashSet[String]()
add(set)
set.contains("3") shouldEqual true
val list = new java.util.LinkedList[String]()
add(list)
list.contains("3") shouldEqual true
}
它编译但我得到一个运行时异常:
java.lang.NoSuchMethodException: java.util.HashSet.add(java.lang.String)
我的问题是: 如何正确定义结构类型,使其可以与 Java 集合一起使用?
请注意,它不能用 Scala 集合替换它们(它将与 Java 库一起使用)。
【问题讨论】:
标签: scala generics structural-typing scala-generics