我需要使用内部类或抽象类型作为外部类型的类型参数,例如在下面高度简化的示例中:
trait A[T <: Ordered[T]] {
}
class B extends A[C] { //<-- Compiler error, type C not found.
class C extends Ordered[C] {
}
}
我在我的库中遇到了一个相当棘手的设计问题,而且我没有看到任何令人满意的方法来避免这种构造。我尝试了很多不同的方法来从类型参数中引用内部类,但都无济于事。
我的问题是:
有没有办法从外部类的类型参数引用内部类?
如果不是,是否存在逻辑上的不一致,或者仅仅是编译器和语言规范的限制?
最佳答案
首先,您需要将 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 = ???
}
}
关于scala - 使用内部类作为类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19204162/