Переопределение функций с параметрами типа, зависящими от пути

Правка : Благодаря Дереку, указавшему на критическую часть сообщения об ошибке, я смог выделить критическую часть немного больше, и, похоже, это касается экзистенциального Типы. Если я правильно понимаю §3.2.10 Existential Quantification over Values ​​ в языковой ссылке, то val m: Map [x.type # S, x.type # S] forSome {val x: T} - это сокращение для val m: Map [t # S, t # S] forSome {type t <: T with Singleton} . Однако в приведенном ниже коде они ведут себя иначе.

trait Type {
  type S
}

class Concrete extends Type {
  type S = Double
}

trait BaseWorks {
  type T <: Type
  val m: t#S forSome { type t <: T with Singleton }
}

class Works extends BaseWorks {
  override type T = Concrete
  override val m = 0.0
}

trait BaseError {
  type T <: Type
  val m: x.type#S forSome { val x: T }
}

class Error extends BaseError {
  override type T = Concrete
  override val m = 0.0
}

Уточнение BaseWorks работает, тогда как уточнение BaseError приводит к ошибке error: переопределение значения m в трейте BaseError типа Error.this.xS forSome {val x: = > Error.this.T}; значение m имеет несовместимый тип . Неправильно ли я интерпретирую §3.2.10?

Исходное сообщение : В следующем фрагменте кода Scala компилятор (2.9.0.1) выдает ошибку, говоря, что метод f2 ничего не отменяет в Производный .

abstract trait Type {
  type T1
  type T2
  type P = (T1, T2)
}

class ConcreteType extends Type {
  type T1 = Double
  type T2 = Double
}

abstract class Base {
  type T <: Type
  type TP = T#P
  def f1(v: TP): TP
  def f2(v: T#P): T#P
  def f3(v: T#P): T#P
}

class Derived extends Base {
  override type T = ConcreteType
  override def f1(v: TP): TP = v
  override def f2(v: T#P): T#P = v
  override def f3(v: TP): TP = v
}

С другой стороны, переопределение функции f3 с точно такой же подписью , как показано в коде, работает. Я ожидал, что обе функции будут вести себя одинаково. Почему это не так?

6
задан Mathias Körner 12 August 2011 в 19:07
поделиться