Scala嵌套的case类自定义继承

时间:2016-01-16 17:29:31

标签: scala generics case-class

我目前正在研究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

}

我有什么方法可以使这个结构有效吗?

1 个答案:

答案 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.Cb的约束:

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