【发布时间】:2014-09-11 00:30:13
【问题描述】:
假设我在一个类中具有以下简单的 Scala 定义:
class Foo {
trait Bar
}
val f = new Foo
type MyAlias = f.Bar
这让我可以将 Bar 与 MyAlias 别名。但是,如果我尝试将其内联以读取type MyAlias = (new Foo).Bar,编译会抱怨。为什么它会抱怨,有没有办法在一行中实现这一点?
【问题讨论】:
假设我在一个类中具有以下简单的 Scala 定义:
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,因为它不是一个有用的表达式——您丢弃了唯一可用于创建该类型的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
【讨论】: