Dart实现二叉搜索树时出现同类型无法赋值错误的原因咨询
解决BST中compareTo的同类型赋值错误
问题原因
你碰到的错误是命名冲突导致的:
- 你自定义了一个具体的
Key类(class Key extends Comparable<Key>) - 同时在
BST类的泛型参数里又用了Key作为类型占位符
这两个Key在Dart的作用域里是完全不同的类型:
get方法的参数key是泛型参数Key的实例currentNode.key是你自定义的Key类的实例
所以哪怕名字一样,Dart也会判定类型不匹配,抛出错误。
另外你的代码还有隐性问题:Node类的key和value固定绑定自定义Key、Value类,和BST的泛型参数不兼容,会导致后续更多类型错误。
修复方案
步骤1:解决命名冲突
要么重命名自定义的Key类(比如改成MyKey),要么重命名BST的泛型参数(比如改成K),避免名字重叠。
步骤2:让Node类支持泛型
把Node改成泛型类,和BST的泛型参数保持一致,让整个BST的类型体系统一。
完整修正代码
// 自定义键类型(如果不需要自定义,也可以直接用num、String等原生Comparable类型) class MyKey extends Comparable<MyKey> { num key; MyKey(this.key); @override int compareTo(MyKey other) { return key.compareTo(other.key); } } class MyValue { dynamic value; MyValue(this.value); } // 泛型Node类,和BST的类型绑定 class Node<K extends Comparable<K>, V> { K key; V value; Node<K, V>? left, right; Node(this.key, this.value); } // 泛型BST类 class BST<K extends Comparable<K>, V> { Node<K, V>? root; V get(K key) { Node<K, V>? currentNode = root; while (currentNode != null) { int compare = key.compareTo(currentNode.key); // 现在类型完全匹配 if (compare > 0) { currentNode = currentNode.right; } else if (compare < 0) { currentNode = currentNode.left; } else { return currentNode.value; } } throw ArgumentError("Key $key not found in BST"); } // 示例:添加put方法 void put(K key, V value) { root = _put(root, key, value); } Node<K, V> _put(Node<K, V>? node, K key, V value) { if (node == null) return Node(key, value); int compare = key.compareTo(node.key); if (compare > 0) { node.right = _put(node.right, key, value); } else if (compare < 0) { node.left = _put(node.left, key, value); } else { node.value = value; } return node; } }
内容的提问来源于stack exchange,提问作者mert Özerdem
相关产品推荐
相关产品推荐

