我有一个关于创建由函数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的子类型,所以你可以做的所有事情都可以做到吗?
答案 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
}}