2014-06-08 3 views
3

у меня есть следующее простое определение Scala признака внутри класса:Scala - альясинга типа внутри типа

class Foo { 
    trait Bar 
} 

val f = new Foo 
type MyAlias = f.Bar 

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

+1

смотрите объяснение здесь: http://stackoverflow.com/a/12959947/384442 – RomanI

ответ

4

Оператор типа . с использованием типов в 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 
Смежные вопросы