将函数从类型T转换为类型U>:T

时间:2013-05-12 09:58:31

标签: scala set contravariance

我有一个关于创建由函数T =>布尔表示的逆变集的问题,如果集合中有东西则返回true,否则返回false。它看起来像这样:

class BoolSet[-T](f: T=>Boolean) {

  def contains(x:T): Boolean = f(x)

  def add(x:T): BoolSet[T] = return new BoolSet[T](((y: T)=> f(y) || y==x))

  def remove(x:T): BoolSet[T] = if(f(x)) return new BoolSet[T](((y: T)=> f(y) && y!=x)) else return this

  def union[U>:T](s : BoolSet[U]) : BoolSet[U] = return new BoolSet[U](((y: U) => this.contains(y) || s.contains(y)))

}

我遇到了union函数的问题,因为this.contains是一个函数T=>Boolean而不是U=>Boolean。如何将此函数从类型T转换为U?

我不明白为什么这不起作用,因为T是U的子类型,所以你可以做的所有事情都可以做到吗?

1 个答案:

答案 0 :(得分:3)

您应该将方法union的签名更改为

def union[U<:T](s : BoolSet[U]) : BoolSet[U]

def union[U>:T](s : BoolSet[U]) : BoolSet[T]

原因是类T中的类型BoolSet 逆变,这意味着BoolSet[A]BoolSet[B]的子类型B <: A }}