2014-06-08 48 views
3

说我有一个类中的性状以下简单的斯卡拉定义中:斯卡拉 - 走样类型的类型

class Foo { 
    trait Bar 
} 

val f = new Foo 
type MyAlias = f.Bar 

这让我别名BarMyAlias。但是,如果我试图内联读取type MyAlias = (new Foo).Bar编译抱怨。它为什么会抱怨,并有一种方法可以实现这一点?

+1

请参阅解释一下:http://stackoverflow.com/a/12959947/384442 – RomanI

回答

4

具有Scala中的类型的.运算符用于路径相关类型。例如,您的f.BarBar的一个实例,它以f作为其父项。编译器禁止(new Foo).Bar,因为它不是一个有用的表达式 - 你扔掉唯一的Foo可以用来创建该类型的实例,所以没有值能够满足该别名。你可能想要的是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