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

Scala 将函数从T型转换为U型>;:T,scala,set,contravariance,Scala,Set,Contravariance,我有一个关于创建一个由函数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): BoolS

我有一个关于创建一个由函数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的一个子类型,所以肯定所有你能做的事都可以做?

你应该将方法
联合的签名更改为

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

原因是
T
类型在
BoolSet
类中是逆变的,这意味着
BoolSet[A]
BoolSet[B]
的一个子类型,如果
B是的,我在看到你的帖子前一刻就看到了这一点。我真傻。无论如何,谢谢你。
def union[U>:T](s : BoolSet[U]) : BoolSet[T]