参考一previous answer of mine on stackoverflow这可以简化吗?
复杂的核心,在短短一个方法说明:
implicit def traversableToFilterOps[CC[X] <: Traversable[X], T]
(xs: CC[T])(implicit witness: CC[T] <:< TraversableLike[T,CC[T]]) =
new MoreFilterOperations[CC[T], T](xs)
有两个问题:
有没有什么办法让编译器的提示
Map
符合签名CC[X] <: Traversable[X]
? 我期望它匹配为Traversable[Tuple2[_,_]]
但这不会发生。最后,我不得不写第二种方法采取CC[KX,VX] <: Map[KX,VX]
,但那种感觉冗余witness: CC[T] <:< TraversableLike[T,CC[T]]
也似乎是多余的给出的第一个类型参数,我的直觉是,这是由Traversable
类型强制执行,必须始终适用于任何可能的子类或值X
,所以应该没有理由明确要求它作为见证。
如果我测试这个在REPL使用一个存在的类型,那么编译器似乎同意我:
scala> implicitly[Traversable[X] <:< TraversableLike[X,Traversable[X]] forSome { type X }]
res8: <:<[Traversable[X],scala.collection.TraversableLike[X,Traversable[X]]] forSome { type X } = <function1>
有没有因此没有办法废除的样板?
答案就在某处这里:https://gist.github.com/445874 – retronym 2011-02-18 10:16:06