传递复杂的通用对象时在Scala中键入推断

时间:2017-11-28 22:25:38

标签: scala generics

我试图弄清楚是否可以使用类型推断来处理传入的复杂对象类型.Test范围之外的对象是我无法控制的。目前我必须专门定义我正在使用的泛型(条形类型)。

trait Martini[A]

trait Foo[A <: Martini[A]] {
  def foo(): A
}

class Bar extends Martini[Bar] {
  def whoAmI = "Bar"
}

object Bar extends Foo[Bar] {
  override def foo(): Bar = new Bar()
}

object Test extends App {
  //    val bar: Bar = test(Bar) // Want to do this, but doesn't work
  val bar: Bar = test[Bar, Bar.type](Bar) // Works
  println(bar.whoAmI)

  def test[A <: Martini[A], F <: Foo[A]](f: F): A = {
    f.foo()
  }
}

我评论出来的是我想要实现的目标。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

通常,没有必要引入像F这样的类型参数,它只用作参数类型一次。它可以简化为

def test[A <: Martini[A]](f: Foo[A]): A = {
  f.foo()
}

这也将在这里修复类型推断。