使用Scala结构类型和抽象类型

10
我正在尝试定义一个结构类型,它定义了任何具有“add”方法的集合(例如Java集合)。使用这个类型,我想定义一些针对特定集合操作的高阶函数。
object GenericTypes {
  type GenericCollection[T] = { def add(value: T): java.lang.Boolean}
}

import GenericTypes._
trait HigherOrderFunctions[T, CollectionType[X] <: GenericCollection[X]] {
    def map[V](fn: (T) => V): CollectionType[V]
    ....
}

class RichJList[T](list: List[T]) extends HigherOrderFunctions[T, java.util.List]

这段代码无法编译,会出现以下错误。
error: Parameter type in structural refinement may not refer to abstract type defined outside that same refinement 

我尝试将参数从GenericCollection中移除,并将其放在方法上:
object GenericTypes {
  type GenericCollection = { def add[T](value: T): java.lang.Boolean}
}
import GenericTypes._
trait HigherOrderFunctions[T, CollectionType[X] <: GenericCollection]

class RichJList[T](list: List[T]) extends HigherOrderFunctions[T, java.util.List]

但是我得到了另一个错误:
error: type arguments [T,java.util.List] do not conform to trait HigherOrderFunctions's type parameter bounds [T,CollectionType[X] <: org.scala_tools.javautils.j2s.GenericTypes.GenericCollection]

有人能给我一些关于如何在Scala中使用结构类型和抽象类型参数的建议吗?或者如何实现我想要的目标?非常感谢!

1个回答

4
作为 票号1906 中所示,在运行时由于缺少类型信息,无法使用定义在结构类型之外的抽象类型。

这也在 Scala 语言参考手册 (3.2.7 结构类型) 中指出:
Within a method declaration in a structural refinement, the type of
any value parameter may only refer to type parameters or abstract types that are
contained inside the refinement.

通常向类型添加新方法的方法是通过隐式类型转换。
trait HigherOrderFunctions[T, CC[_]] {
    def zap[V](fn: () => V): CC[V]
}

class RichJList[T](list: java.util.List[T]) extends HigherOrderFunctions[T, java.util.List]{
    def zap[V](fn: () => V): java.util.List[V] = {
        val l = new java.util.ArrayList[V]
        l add fn()
        l
    }
}
implicit def list2RichList[T](l : java.util.List[T]) = new RichJList(l)
new java.util.ArrayList[AnyRef]() zap (() => 2)

如果编译器发现类型缺少zap方法,它将把该类型转换为具有zap方法的类型,并在作用域中使用隐式转换方法(此处为list2RichList)。

scala> new java.util.ArrayList[AnyRef]() zap (() => 2)
res0: java.util.List[Int] = [2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接