我认为类型字段是一种更强大的类型参数语法,但我遇到了一个例子,我可以通过后者而不是前者来表达我的意图。
问题是 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 T
到 type constructor
.
This将是一本好书。
关于扩展更高种类类型时的 Scala 类型参数与类型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19812370/