3
说我有一个类中的性状以下简单的斯卡拉定义中:斯卡拉 - 走样类型的类型
class Foo {
trait Bar
}
val f = new Foo
type MyAlias = f.Bar
这让我别名Bar
与MyAlias
。但是,如果我试图内联读取type MyAlias = (new Foo).Bar
编译抱怨。它为什么会抱怨,并有一种方法可以实现这一点?
说我有一个类中的性状以下简单的斯卡拉定义中:斯卡拉 - 走样类型的类型
class Foo {
trait Bar
}
val f = new Foo
type MyAlias = f.Bar
这让我别名Bar
与MyAlias
。但是,如果我试图内联读取type MyAlias = (new Foo).Bar
编译抱怨。它为什么会抱怨,并有一种方法可以实现这一点?
具有Scala中的类型的.
运算符用于路径相关类型。例如,您的f.Bar
是Bar
的一个实例,它以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
请参阅解释一下:http://stackoverflow.com/a/12959947/384442 – RomanI