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