假设我在类中有一个特征的简单Scala定义:
class Foo {
trait Bar
}
val f = new Foo
type MyAlias = f.Bar
这允许我将Bar
替换为MyAlias
。但是,如果我尝试内联阅读type MyAlias = (new Foo).Bar
编译抱怨。为什么它会抱怨,有没有办法在一行中实现这一目标?
答案 0 :(得分: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