我需要使用内部类或抽象类型作为外部类型的类型参数,例如在下面的大量简化示例中:
trait A[T <: Ordered[T]] {
}
class B extends A[C] { //<-- Compiler error, type C not found.
class C extends Ordered[C] {
}
}
我的图书馆遇到了一个相当棘手的设计问题,我没有看到任何令人满意的方法来避免这种结构。我已经尝试了许多不同的想法来从类型参数引用内部类,但无济于事。
我的问题是:
有没有办法从外部类的类型参数引用内部类?
如果没有,是否存在排除这种情况的逻辑不一致,或者只是限制了编译器和语言规范?
答案 0 :(得分: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 = ???
}
}