2

有谁知道这个编译器错误是怎么回事?如果我不扩展 INode,错误就会消失。

trait AbsTypes
{
    type TKey
    type TValue
}

trait INode extends AbsTypes
{
    def get(key : TKey) : TValue
    def set(key : TKey, v : TValue) : INode
}

class ANode[TKey,TValue](
  val akey : TKey,
  val aval : TValue
) extends INode
{
    // ERROR : type mismatch;  found   : ANode.this.aval.type (with underlying type TValue)  required: ANode.this.TValue
    def get(key : TKey) : TValue = { aval }
    def set(key : TKey, v : TValue) : INode = {
        new ANode(key,v)
    }
}
4

2 回答 2

4

通用参数不会自动覆盖抽象类型,即使它们具有相同的名称。尝试重命名泛型参数(以避免名称冲突),然后在方法体中声明类型TKey和。TValue

class ANode[A,B](
  val akey : A,
  val aval : B
) extends INode {
    type TKey=A
    type TValue=B
    def get(key : TKey) : TValue =  aval 
    def set(key : TKey, v : TValue) : INode = new ANode(key,v)
}

我想如果编译器在您指定泛型类型名称的行上发出错误,而不是等到您开始使用这些类型,那会很好。

于 2010-07-26T00:48:47.183 回答
1

不幸的是,我没有时间测试我要写的东西,但我对你的代码的理解是每个 INode 都会得到它自己的 TValue 类型。所以 get 操作真正返回的 INode.this.TValue 与另一个节点上的另一个 TValue 类型不兼容。

避免这种情况的方法可能是这样写:

trait Nodes {
  type TKey
  type TValue

  trait INode {
   def get(key : TKey) : TValue
  }

  class ANode(
    val akey : TKey,
    val aval : TValue
  ) extends INode
}
于 2010-07-26T00:50:06.117 回答