Scala 嵌套案例class 自约束继承
Scala nested case class self-bounding inheritance
我目前正在研究 Scala 中的 A* 实现。为了实现一个干净的结构,我想使用一个嵌套的 case class 结构来实现一个自我限制的特征。但是,我在 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
。它是一个 path-dependent 类型,我们不知道它属于 B
的哪个实例。但是,C
扩展了 A[C]
,这已经与在该上下文中说 A[this.C]
相同,后者绑定到 B
的特定实例。 foo
将类型参数 T
视为 B#C
,这与某些 b
的 b.C
不同。
你有两种选择来编译。
将A
的约束放宽到B#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)
}
或者处理path-dependent类型,这样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)
}
我目前正在研究 Scala 中的 A* 实现。为了实现一个干净的结构,我想使用一个嵌套的 case class 结构来实现一个自我限制的特征。但是,我在 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
。它是一个 path-dependent 类型,我们不知道它属于 B
的哪个实例。但是,C
扩展了 A[C]
,这已经与在该上下文中说 A[this.C]
相同,后者绑定到 B
的特定实例。 foo
将类型参数 T
视为 B#C
,这与某些 b
的 b.C
不同。
你有两种选择来编译。
将A
的约束放宽到B#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)
}
或者处理path-dependent类型,这样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)
}