在Scala中定义类型安全可选方法的最佳方法是什么?

yur*_*ura 5 generics scala scala-collections

可选方法是在类泛型具有特定类型时可以应用的方法.例子:

list.unzip //works only if this is collection of pairs
list.sum //works only if this collection of numbers
Run Code Online (Sandbox Code Playgroud)

目前我想要实现回归方法,它具有与解压缩相同的约束(即2d点的集合),但我不知道如何确保方法(implicit asPair: A => (A1, A2)存在以及定义此类转换的最佳位置.

dhg*_*dhg 10

以下是TraversableOnce.toMap确保仅在对的集合上调用它的方法.

def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = {
  val b = immutable.Map.newBuilder[T, U]
  for (x <- self)
    b += x
  b.result
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您希望在现有集合类中添加类似的方法,则可以使其更加简单:

class EnhancedIterable[T,U](x: Iterable[(T,U)]) { // CanBuildFrom omitted for brevity
  def swapAll() = x.map(_.swap)
}
implicit def enhanceIterable[T,U](x: Iterable[(T,U)]) = new EnhancedIterable(x)

List((1,2), (3,4), (5,6)).swapAll // List((2,1), (4,3), (6,5))
List(1, 2, 3).swapAll // error: value swapAll is not a member of List[Int]
Run Code Online (Sandbox Code Playgroud)