You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:25:31