如何从Scala中的特征实例化泛型函数?

时间:2016-02-25 10:17:36

标签: scala generics

当我尝试定义一个扩展特征的类时,我在Scala中遇到了一个奇怪的类型不匹配错误。我定义了以下特征

trait T {
    def f[A,B](x: A): B
}

然后我定义了以下实现此特征的类

class A() extends T {
    def f[Unit,Int](x: Unit) = {
        10
    }
}

这背后的想法是,我想保证任何具有T trait的类都有一个名为" f"的函数,不管这个函数的形状如何(即不管它的类型如何)。 / p>

当我尝试执行上面的代码时出现问题,我收到以下错误

  

定义特征T       :14:错误:类型不匹配;       发现:scala.Int(10)       必需:Int

所以我不知道如何指定类型以便使这项工作。我试图将f实例化为

    def f[Unit,scala.Int(10)](x: Unit) = {
        10
    }

然后编译器抱怨类型名称不能有'。' 。 我错过了什么?

1 个答案:

答案 0 :(得分:2)

你可以做这样的事情

trait T[A,B] {
  def f(x: A): B
}

class Impl1 extends T[Int, Unit] {
  override def f(x: Int): Unit = println(x)
}

class Impl2 extends T[Unit, Int] {
  override def f(x: Unit): Int = 10
}