scala之找不到参数排序的隐式值

zhujiabin 阅读:91 2025-06-02 22:19:02 评论:0

尝试编译时出现以下错误:

Btree.scala:9: 错误:找不到参数排序的隐式值:Ordering[K] 抽象类 Node[K,V] 扩展 TreeMap[K,V]

TreeMap 应该接受我提供的隐式 Ordering[A] val。也许隐式参数需要在实例化 Btree(TreeMap) 的对象 Tester 中? 我更愿意将隐式声明保留在 Btree 类中,因为我希望 Ordering 具有实现 Comparable[K] 的类型 K。说得通?

package disttree { 
    import scala.collection.immutable.TreeMap 
 
    class Btree[K <: Comparable[K],V](fanout:Int) { 
        implicit object DefaultOrder extends Ordering[K] { 
            def compare(k1: K, k2: K) = k1 compareTo k2 
        } 
 
        abstract class Node[K,V] extends TreeMap[K,V] 
 
        class InnerNode[K,V] extends Node[K,V] 
 
        class LeafNode[K,V] extends Node[K,V] 
 
        val root = new InnerNode[K,V]() 
 
        def search(n: Node[K,V], key: K): Option[(K,V)] = { 
            return n.find(_ == key) 
        } 
 
        def insert(key: K, value: V) { } 
 
        def delete(key: K) { } 
    } 
} 
 
import disttree._; 
object Tester { 
    def main(args: List[String]) = { 
        var t = new Btree[Int, Any](2) 
        t.insert(1, "goodbye") 
        Console.println(t) 
    } 
} 

请您参考如下方法:

常见错误。这是两个不同的 K:

class Btree[K <: Comparable[K],V](fanout:Int) { 
    // The K below is the type parameter of Btree 
    implicit object DefaultOrder extends Ordering[K] { 
        def compare(k1: K, k2: K) = k1 compareTo k2 
    } 
 
    // The K in the error is the type parameter of Node 
    abstract class Node[K,V] extends TreeMap[K,V] 
 
    // And this is yet another K 
    class InnerNode[K,V] extends Node[K,V] 
 
    // And yet another 
    class LeafNode[K,V] extends Node[K,V] 

使用 -explaintypes -uniqid 并显式传递参数,我得到:

<console>:13: error: type mismatch; 
 found   : Btree#31335.this.DefaultOrder#31343.type (with underlying type object Btree#31335.this.DefaultOrder#31344) 
 required: Ordering#3222[K#31346] 
               abstract class Node[K,V] extends TreeMap[K,V]()(DefaultOrder) 
                                                               ^ 
Btree#31335.this.DefaultOrder#31343.type <: Ordering#3222[K#31346]? 
  object Btree#31335.this.DefaultOrder#31344 <: scala.math.Ordering#11986[K#31346]? 
    scala.math.Ordering#11986[K#31336] <: scala.math.Ordering#11986[K#31346]? 
      K#31346 <: K#31336? 


标签:Scala
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号