扩展更高种类类型时的 Scala 类型参数与类型字段

标签 scala inheritance types

我认为类型字段是一种更强大的类型参数语法,但我遇到了一个例子,我可以通过后者而不是前者来表达我的意图。 问题是 trait A 可以编译,而 trait B 不能编译。

trait Box[T]

trait A[T] extends (Box[T] => Box[T]) {
    override def apply(box: Box[T]): Box[T] = identity(box)
}

trait B extends (Box[T] => Box[T]) {
    type T
    override def apply(box: Box[T]): Box[T] = identity(box)
}

有没有办法像 B 一样使用类型字段来表达 A 中表达的内容?

编辑: 错误信息:

not found: type T
trait B extends (Box[T] => Box[T]) {
not found: type T
trait B extends (Box[T] => Box[T]) {

最佳答案

override在当前代码中无用,必要时重新添加。

使用 abstract type member将创建具体类型以使用占位符语法作为参数传递。

trait Box[T]

trait A[T] extends (Box[T] => Box[T]) {
    def apply(box: Box[T]): Box[T] = identity(box)
}

对于 B , 使用 type成员 T 与 Box[T] => Box[T]将:

  • 强制扩展类以遵守类型绑定(bind)。

  • 创建一个具体类型作为参数传递

    trait B extends (Box[_] => Box[_]) { type T <: (Box[T] => Box[T]) def apply(box: Box[T]): Box[T] = identity(box) }

编译器告诉你它找不到 type T传递给 type constructor . 在B的情况下,你试图在定义它之前传递它。

higherKind占位符语法将传递内部 type Ttype constructor .

This将是一本好书。

关于扩展更高种类类型时的 Scala 类型参数与类型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19812370/

相关文章:

c++ - 从 C++ 函数返回批量数据的最佳数据类型

c++ - 析构函数不在控制台上打印行

c++ - 与 C++ 继承混淆

scala - 如何在 Scala 列表中找到重复的项目?

scala - 无法在 Windows 上使用 0.13.1 为对象堆保留足够的空间?

java - 为什么在扩展抽象类中需要另一个构造函数?

c - GCC 与 C11 标准中的位字段类型

java - 将对象从父类类型转换为子类

scala - 将带有参数的案例类作为案例类转换为 Avro 消息以发送到 Kafka

scala - 覆盖继承的构造函数字段时的差异?