3

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

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)
}

有没有办法表达A使用类型字段表达的内容B

编辑:错误信息:

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

1 回答 1

1

override当前代码中没有用,如果需要重新添加。

使用 anabstract 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]will 一起使用:

  • 强制扩展类遵守类型绑定。

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

    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.

将是一本好书。

于 2013-11-06T15:26:15.030 回答