scala - 使用内部类作为类型参数

标签 scala generics inner-classes abstract-type

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

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

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

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

我的问题是:

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

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

最佳答案

首先,您需要将 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/

相关文章:

scala - 迭代过程的流与尾递归

ruby - 动态语言——我应该选择哪一种?

scala - 将 Monad 包装到解析器中 - 我是否需要 Monad Transformers 以及如何做到这一点?

java - 将函数与恒等函数组合会导致类型不匹配

java - Spring MVC 绑定(bind)嵌套对象

scala - 如何避免 return 语句和 for 循环的逃逸?

具有内部泛型的 C# 转换对象

c# - 如果我从现有列表创建新的 List<T>,成员是否相等?

java - 如何将变量传递给内部类

java - 为什么实例和静态内部类的初始化不同?