【问题标题】:Scala Abstract Type MemberScala 抽象类型成员
【发布时间】:2015-06-14 10:03:26
【问题描述】:

我注意到我可以使用抽象类型成员实例化 scala 特征。下面的代码编译。但是 t.B 是什么?

trait A {
    type B
}

val t = new A {}

【问题讨论】:

  • 你不能实例化一个特征。
  • @I.K.当然,如果您为所有抽象方法和值提供定义,则可以。这里 A 没有 def 和 vals,所以你不必提供任何东西。它只是工作。
  • 你不能实例化一个特征。这段代码的作用是实例化一个扩展特征的匿名子类。
  • 我知道我正在使用匿名类扩展该特征。我正在实例化匿名类而不是特征。很抱歉,我的问题跳过了一点。 @Kolmar,这是否意味着如果 B 没有在 A 中的任何地方使用,那么我不需要为它提供具体类型?
  • @intangible02,特征“A”中的“B”只是一个类型参数。您可以使用来指定 A 中其他成员的类型,而无需指定该类型的真正含义。你想在这里达到什么目的?如果我们知道,也许我们可以提供进一步的帮助。

标签: scala abstract-type


【解决方案1】:

类型是t.B

trait A {
  type B
  def f(b: B)
}

val t = new A { def f(b: B) = {} }

t.f(0)

有错误

error: type mismatch;
found   : Int(0)
required: t.B

类型不必像方法一样被“覆盖”。

这种类型是它自己的东西。它不是很有用,但就是这样。

与所有其他类型一样,它是Any 的子类型和Nothing 的超类型。

Seq[t.B](): Seq[Any]
Seq[Nothing](): Seq[t.b]

这就是所有可以说的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多