Scala特征方法仅限于实现类型

时间:2017-01-17 19:24:06

标签: scala types

所以我在特质实施中遇到一些非常简单的问题时遇到了一些麻烦,我希望有一些我想念的简单解决方案。我希望在一个trait上有一个方法,它接受一个参数(并且只返回一个值,它只是调用它的具体实现的类型。具体来说:

trait Foo {
  type ConcreteFoo // what to put here?
  def combine(that:ConcreteFoo):ConcreteFoo
}

class FooImpl1 extends Foo {
  def combine(that:FooImpl1):FooImpl1 = {
    // implementation
  }
}

class FooImpl2 extends Foo {
  def combine(that:FooImpl2):FooImpl2 = {
    // implementation
  }
}

现在我在实施课程上有一个type Self = FooImpl,但是如果可能的话,我宁愿在这个特性上做些什么。

2 个答案:

答案 0 :(得分:1)

这正是F-Bounded Polymorphism:

trait Foo[T <: Foo[T]]
  def combine(that: T): T
}

class FooImpl1 extends Foo[FooImpl1] {
  def combine(that: FooImpl1): FooImpl1 = {
    ???
  }
}

class FooImpl2 extends Foo[FooImpl2] {
  def combine(that: FooImpl2): FooImpl2 = {
    ???
  }
}

答案 1 :(得分:0)

您可以在特征中添加类型参数,如下所示:

try {
    ...
} catch(Exception e) {
    throw new IllegalStateException(e);
}