class需要是抽象的,因为没有定义trait中的value元素

时间:2017-05-16 14:59:28

标签: scala

我正在玩依赖类型并遇到此错误:

some.scala:17: error: class B needs to be abstract, since value element in trait
 Buffer of type B.this.T is not defined

使用此代码:

package types

object Demo {

trait Buffer {
  type T
  val element: T
}

abstract class Wee extends Buffer {
    type T <:    Integer
    val s = element - 2

}

class B extends Wee {
}

}

有人可以解密什么值元素代表什么?

1 个答案:

答案 0 :(得分:3)

第一个问题是你使用抽象类型的成员是没有可能的原因。它与你的错误没有直接关系,但是唉。

package types

object Demo {

trait Buffer[T] {
  def element: T
}

abstract class Wee extends Buffer[Integer] {
  def s: Integer = element - 2

}

现在好了,对于实际的失败,它非常明显和直截了当,你还没有提供element的实现。您的Wee班级extends Buffer,因此任何具体的实施者都必须通过您的合同为element提供实施。

traitabstract class可以有抽象成员,普通class则不能。 Ergo,kaboom,编译器告诉你让你的OOP达到最佳状态。

class B extends Wee {
  val element = 5
}

或者更好:

class B(val element: Integer) extends Wee