Scala中WBTreeSet默认参数编译报错:缺少K=>Ordered[K]隐式视图
Scala隐式参数与默认参数冲突问题修复
这个问题其实是Scala默认参数初始化时的隐式作用域顺序坑——当你在WBTreeSet的默认参数里调用Tree[K, Nothing]()时,此时方法签名里的implicit ord还没被纳入当前作用域,编译器找不到构建Tree需要的隐式参数,所以才会报错。
不用改类结构的话,只需要调整WBTreeSet的默认参数初始化逻辑,显式把后面的隐式参数传递给默认的Tree实例就行:
case class WBTreeSet[K](tree: Tree[K, Nothing] = Tree[K, Nothing]()(ord))(implicit ord: K => Ordered[K])
这样修改后,编译器就能正确关联到需要的隐式参数,而且完全保留了你原来的类层级定义。
原理说明
原来的写法中,默认参数Tree[K, Nothing]()会在WBTreeSet的隐式参数ord被绑定之前尝试解析,此时作用域里还没有这个隐式值。而显式传递(ord)后,我们明确告诉编译器:用后面定义的那个隐式ord来构建默认的Tree,这就符合了Scala的隐式参数解析顺序规则。
另外还有一种等价写法,用implicitly来获取当前隐式值,效果完全一样:
case class WBTreeSet[K](tree: Tree[K, Nothing] = Tree[K, Nothing]()(implicitly))(implicit ord: K => Ordered[K])
测试验证
现在你可以正常创建WBTreeSet实例了,比如:
val intSet = WBTreeSet[Int]() // 编译器自动找到Int的Ordered隐式转换
内容的提问来源于stack exchange,提问作者Bestest
相关产品推荐
相关产品推荐

