1

[编辑更新] 这是对我的问题的正确陈述。

我希望在 a 中调用构造函数trait。但似乎我必须使用apply功能。它是否存在像 new this() 这样的用法?

就像下面的代码。它抛出类型不匹配。我希望添加构造函数的约束,或者我必须使用apply函数。

  trait B { this:C =>
    def values:Seq[Int]
    def apply(ints:Seq[Int]):this.type
    def hello:this.type = apply( values map (_ + 1) )
  }

  trait C

  class A(val v:Seq[Int]) extends C with B{
    override def values: Seq[Int] = v

    override def apply(ints: Seq[Int]): A.this.type = new A(ints)
  }
4

1 回答 1

4

this.type是此特定实例的类型。所以你可以写

override def hello = this

但你不能写

override def hello = new A()

因为A是 的超类型this.type

可能你想要

trait B { this: C =>
  type This <: B /*or B with C*/
  def hello: This
}

trait C

class A extends C with B {
  type This = A
  override def hello = new A()
}

或者甚至可能

trait B { self: C =>
  type This >: self.type <: B with C { type This = self.This }
  def hello: This
}

在 Scala 中返回“当前”类型 https://tpolecat.github.io/2015/04/29/f-bounds.html

于 2019-09-10T14:45:31.140 回答