我目前正在研究Scala中的A *实现。为了实现一个干净的结构,我想使用一个嵌套的case类结构,它实现了一个自我限制的特征。但是,在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
}
我有什么方法可以使这个结构有效吗?
答案 0 :(得分:5)
不确定为什么要这样,但这就是为什么它不会按原样运作:
<div class="container-fluid">
<div style="position: absolute; width: 100%;">
<div class="row">
<div class="col-md-2"></div>
<div class="col-md-2" style="text-align: center; z-index: 9999;">
<div style="background-color: red;"> # Adding position: fixed here works but breaks box width
<img src="/assets/image/logo.jpg">
<br>
Something
</div>
</div>
<div class="col-md-8"></div>
</div>
</div>
<div class="row" style="height: 100%;">
<div class="col-md-3" style="position: relative;">
<div>
<img src="/assets/image/leftImage.jpg">
</div>
</div>
<div class="col-md-1"></div>
<div class="col-md-8">
Lorem ipsum...
</div>
</div>
</div>
的类型为D.c
。它是一种路径依赖类型,我们不知道它属于哪个B#C
实例。但是,B
扩展C
,这与在该上下文中说A[C]
已经相同,后者绑定到A[this.C]
的特定实例。 B
将类型参数foo
视为T
,与某些B#C
的{{1}}不同。
您可以通过两种方式进行此编译。
放宽b.C
到b
的约束:
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)
}
类型:
c