【问题标题】:Scala - aliasing a type inside a typeScala - 在类型中为类型起别名
【发布时间】:2014-09-11 00:30:13
【问题描述】:

假设我在一个类中具有以下简单的 Scala 定义:

class Foo {
  trait Bar
}

val f = new Foo
type MyAlias = f.Bar

这让我可以将 BarMyAlias 别名。但是,如果我尝试将其内联以读取type MyAlias = (new Foo).Bar,编译会抱怨。为什么它会抱怨,有没有办法在一行中实现这一点?

【问题讨论】:

标签: scala traits


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 2021-11-06
    • 2014-10-06
    • 2013-03-18
    • 2018-04-21
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    相关资源
    最近更新 更多