3

我需要使用内部类或抽象类型作为外部类型的类型参数,例如在下面高度简化的示例中:

trait A[T <: Ordered[T]] {
}

class B extends A[C] { //<-- Compiler error, type C not found.
  class C extends Ordered[C] {
  }
}

我在我的库中遇到了一个相当棘手的设计问题,而且我没有看到任何令人满意的方法来避免这种结构。我尝试了许多不同的方法来从 type 参数引用内部类,但无济于事。

我的问题是:

  1. 有没有办法从外部类的类型参数中引用内部类?

  2. 如果不是,是否存在排除这种情况的逻辑不一致,或者仅仅是编译器和语言规范的限制?

4

1 回答 1

6

首先,您需要有资格C成为内部类,例如使用投影:

class B extends A[B#C] {
  class C extends Ordered[C]
}

这会产生“非法循环引用”,因此它是编译器的限制

您可以将类型构造函数参数更改为A类型成员:

trait A {
  type T <: Ordered[T]
}

class B extends A {
  class T extends Ordered[T] {
    def compare(that: T): Int = ???
  }
}
于 2013-10-06T10:35:03.953 回答