Вы можете расширять классоподобные сущности в Scala (т. Е. Классы, признаки, интерфейсы Java), а не типы в целом (т. Е. Структурные типы, параметры типа или члены).Тем не менее, вы можете самостоятельно набрать для всех этих.Это означает, что мы можем переписать ваш некомпилируемый trait c
следующим образом:
trait c { self : t =>
def x : Int = 1
}
В теле c
тип this
теперь известен как t
, т.е.известно, что он соответствует структурному типу { def x : Int }
, и будет возможно только смешать c
в класс, который фактически соответствует этому структурному типу (либо путем непосредственного внедрения сигнатуры, либо, если он абстрагируется, путем повторного подтверждениявведите и распространяете обязательство на возможный конкретный класс),
type t = { def x : Int }
trait c { self : t => }
class t2 extends c { // OK, t2 conforms to t
def x : Int = 1
}
def myt : t = new t2 // OK, as before
class t3 extends c { // Error: t3 doesn't conform to c's self-type
def y : String = "foo"
}