我目前正在Scala中进行A *实现。为了完成整洁的结构,我想使用实现自限特征的嵌套案例类结构。但是,在Scala IDE中实现此功能时遇到一些问题。以下代码将无法编译:

trait A[T <: A[T]]

class B {

    case class C(int: Int) extends A[C] // A[this.C] won't work either

    def make = C(5)

}

object D {

    def foo[T <: A[T]](some: T) = {}

    val c = new B().make

    foo(c) // this does not compile

}

有什么办法可以使这种结构起作用?

最佳答案

不知道为什么要这样做,但是这就是为什么它不能按原样工作的原因:
D.c的类型是B#C。这是一种与路径有关的类型,在这种类型中,我们不知道它属于哪个B实例。但是,C扩展了A[C],这与在该上下文中说A[this.C]相同,后者已绑定到B的特定实例。 foo将类型参数T视为B#C,这与某些b.Cb不同。

您可以通过两种方法进行编译。

放松AB#C的约束:

trait A[T <: A[T]]

class B {

    case class C(int: Int) extends A[B#C]

    def make = C(5)

}

object D {

    def foo[T <: A[T]](some: A[T]) = {}

    val c = new B().make

    foo(c)

}

或处理与路径相关的类型,以便c具有b.C类型:
trait A[T <: A[T]]

class B {

    case class C(int: Int) extends A[C]

    def make = C(5)

}

object D {

    def foo[T <: A[T]](some: A[T]) = {}

    val b = new B
    val c: b.C = b.make

    foo(c)

}

10-05 21:21