Scala - псевдоним типа внутри типа

Скажем, у меня есть следующее простое определение черты Scala внутри класса:

class Foo {
  trait Bar
}

val f = new Foo
type MyAlias = f.Bar

Это позволяет мне псевдоним Bar с MyAlias, Однако, если я попытаюсь вставить это, чтобы прочитать type MyAlias = (new Foo).Bar компиляция жалуется. Почему он жалуется и есть ли способ добиться этого в одной строке?

1 ответ

Решение

. Оператор с типами в Scala используется для зависимых от пути типов. Например, ваш f.Bar это пример Bar который имеет f как его родитель. Компилятор запрещает (new Foo).Bar потому что это не полезное выражение - вы выбрасываете только Foo которые могут быть использованы для создания Bar экземпляры этого типа, поэтому никакое значение никогда не сможет удовлетворить этот псевдоним.

То, что вы, возможно, хотели Foo#Bar, Это не зависимый от пути тип. любой Bar, не важно что Foo это связано с, это Foo#Bar,

Вот пример:

class Foo {
  class Bar
}

val f1 = new Foo
val f2 = new Foo
val b1 = new f1.Bar
val b2 = new f2.Bar

// This won't compile, because b2 is a f2.Bar, not an f1.Bar
// val pathDependentBar: f1.Bar = b2

val FooHashBar: Foo#Bar = b1
Другие вопросы по тегам