2

我有一个关于创建一个由函数 T=>Boolean 表示的逆变集的问题,如果集合中有东西,则返回 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 的子类型,所以肯定 U 能做的一切 T 也能做?

4

1 回答 1

3

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

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

或者

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

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

于 2013-05-12T10:19:23.183 回答