【问题标题】:How to instantiate generic function from a trait in Scala?如何从 Scala 中的特征实例化泛型函数?
【发布时间】:2016-06-08 01:20:17
【问题描述】:

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

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

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

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

这背后的想法是,我想保证任何具有 T 特征的类都有一个名为“f”的函数,而不管这个函数的形状(即不管它的类型)。

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

定义的特征 T :14: 错误:类型不匹配; 找到:scala.Int(10) 必需:整数

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

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

但是编译器抱怨类型名称不能有'.' . 我错过了什么?

【问题讨论】:

  • 当您编写 def f[Unit,Int](x: Unit) 时,您声明了一个具有两个类型参数 UnitInt 的泛型方法,它们隐藏了同名的内置类型。

标签: scala generics


【解决方案1】:

你可以这样做

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
}

【讨论】:

  • 我明白了,这允许有泛型 f 但问题是现在 Impl1 和 Impl2 是两种不同的类型。我的意思是,我不能在包含 T 类型元素的 List 中拥有 Impl1 类的另一个对象和 Impl2 类的另一个对象(即我不能做 List[T] = List(new Impl1(), new Impl2())),对吗?
猜你喜欢
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 2011-11-25
  • 2014-09-23
  • 2021-07-02
相关资源
最近更新 更多