Scala абстрактный путь, зависящий от типа проблемы - PullRequest
2 голосов
/ 26 июля 2010

Кто-нибудь знает, что здесь происходит с этой ошибкой компилятора? Ошибка исчезнет, ​​если я не расширю 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)
    }
}

Ответы [ 2 ]

4 голосов
/ 26 июля 2010

Общие параметры не переопределяют автоматически абстрактные типы, даже если они имеют одинаковые имена. Попробуйте переименовать общие параметры (чтобы избежать конфликтов имен), а затем объявить типы 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)
}

Полагаю, было бы неплохо, если бы компилятор выдавал ошибку в строке, где вы указали имена универсальных типов, вместо того, чтобы ждать, пока вы не начнете использовать эти типы.

1 голос
/ 26 июля 2010

У меня нет времени, к сожалению, проверить то, что я собираюсь написать, но я понимаю, что ваш код состоит в том, что каждый 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
}
...