为什么 Scala 更喜欢隐式参数而不是扩展特征?

Why does Scala prefer implicit parameters over extending a trait?

Scala 排序 API 使用隐式对象。 例如:

def msort[T](xs: List[T])(implicit ord: Ordering) = { ...} 

Java 出于相同目的使用 Comparable 接口。

public static <T extends Comparable<? super T>> void sort(List<T> list) { ... }

为什么 Scala 更喜欢隐式类型而不是扩展特征?隐式参数有什么好处?

  1. 对于给定类型,您可以将 msort 与多个 Ordering 一起使用。扩展 Comparable 的类型只能以一种方式扩展它。 (有些人认为这是一个缺点。)

  2. 您可以为在不知情的情况下实现的类型提供 Ordering(例如,任何 Java 类型!)。你不能使现有类型扩展 Comparable 如果它还没有。