鉴于以下内容无法编译
trait Wrapper[T]{
def apply[U](f: U) = f(this)
}
trait Mapper{
def apply[V](w: Wrapper[V]): Option[V]
}
我们如何编写Wrapper.apply
以便这样的实例可以接受Mapper
实例?
问题是我无法正确约束U
,因为使用的函数(Mapper.apply
)本身是通用的。
由于该函数是通用的,因此我也无法“提升” Mapper.apply
的输入/输出类型以键入成员。
答案 0 :(得分:0)
我们如何编写Wrapper.apply以便这样的实例可以接受Mapper实例?
好吧,def apply(f: Mapper) = f(this)
?
或
trait Wrapper[T]{
def apply[U](f: Wrapper[T] => U) = f(this)
}
val wrapper: Wrapper[Int] = ...
val mapper: Mapper = ...
wrapper.apply(mapper(_))
尽管这实际上并不能直接接受Mapper
实例。
当然,您可以将Mapper
接受方法和函数接受方法都作为重载。
答案 1 :(得分:0)
也许是这样吗?
trait Wrapper[T]{
final def apply[U >: T](m: Mapper[U]): Option[T] = m(this)
}
trait Mapper[-T] {
def apply[V <: T](w: Wrapper[V]): Option[V]
}
如果您可以分享一个用例示例,那么我可以确定这是否是您所需要的。