Scala - 别名类型中的类型

时间:2014-06-08 20:41:28

标签: scala traits

假设我在类中有一个特征的简单Scala定义:

class Foo {
  trait Bar
}

val f = new Foo
type MyAlias = f.Bar

这允许我将Bar替换为MyAlias。但是,如果我尝试内联阅读type MyAlias = (new Foo).Bar编译抱怨。为什么它会抱怨,有没有办法在一行中实现这一目标?

1 个答案:

答案 0 :(得分:4)

Scala中具有类型的.运算符用于路径相关类型。例如,您的f.BarBar的实例,其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