17

有一个常见的 Java 习惯用法(Enum例如见)来声明必须匹配实际派生类型的泛型类型变量。

class Enum<E extends Enum<E>> {
...
}

或者,如果需要更通用的参数:

abstract class Foo<T, Actual extends Foo<T, Actual>> {
    //now we can refer to the actual type
    abstract Actual copy();
}
class Concrete<T> extends Foo<T, Concrete<T>> {
    Concrete<T> copy() {...}
}

事情很快就会变得非常冗长,所以我想 Scala 可能有比上面例子的直译更好的东西。

有没有更优雅的方法来实现这一点?

4

1 回答 1

11

另一种表述是使用抽象类型成员:

trait Foo { self => 
  type A <: Foo {type A = self.A}
}

用你的例子:

trait Foo { self =>
  type T
  type Actual <: Foo {type T = self.T; type Actual = self.Actual}
}

trait Concrete extends Foo { self =>
  type T
  type Actual = Concrete {type T = self.T}
}

虽然这种重新表述在 trait/class 声明中并不是真的更好,但在使用 trait/classes 时它可能会更简洁。(据我所知,没有其他方法可以重新表述递归类型)。

于 2013-01-30T23:08:45.797 回答