定义带Ordered[K]约束的MyCollection类时编译报错,原因何在?
问题分析与解决
你这里的核心问题是混淆了Scala中Ordered特质和Ordering类型类的作用差异:
Ordered[K]是让K自身具备比较能力(需实现compare方法),属于面向对象风格的比较机制;- 而
Seq.sorted方法依赖的是Ordering[K]类型类的隐式实例,这是类型类风格的比较机制。
你添加的K: Ordered[K]上下文约束,是要求作用域内存在Ordered[K]的隐式值,但sorted方法需要的是Ordering[K]实例,编译器找不到对应隐式实现,因此报错。
解决办法一:直接使用Ordering上下文约束
如果你的需求只是让集合元素支持排序,不需要强制K实现Ordered特质,直接修改泛型约束即可:
class MyCollection[K: Ordering] { def func(seq: Seq[K]): Unit = { seq.sorted } }
此时编译器能自动找到sorted所需的Ordering[K]隐式实例,问题直接解决。
解决办法二:强制K实现Ordered特质
如果你明确要求元素K必须实现Ordered[K]特质,可以导入Scala内置的隐式转换,将Ordered[K]转换为Ordering[K]:
import scala.math.Ordering.Implicits._ class MyCollection[K <: Ordered[K]] { def func(seq: Seq[K]): Unit = { seq.sorted } }
这里用<: Ordered[K]上界约束确保K是Ordered[K]的子类,导入隐式转换后,编译器会自动完成Ordered到Ordering的转换,供sorted使用。
你也可以用上下文约束配合转换导入,效果类似但更灵活(允许通过隐式提供Ordered[K]实例,不一定要求K直接继承特质):
import scala.math.Ordering.Implicits._ class MyCollection[K: Ordered] { def func(seq: Seq[K]): Unit = { seq.sorted } }
内容的提问来源于stack exchange,提问作者Ziqi Liu
相关产品推荐
相关产品推荐

