Scala 中的参数多态性

Parametric polymorphism in scala

我正在尝试实现参数多态性以将具有使用 asInstanceOf[] 的大小写匹配语句的函数下放。我需要将参数类型与接受参数的项目的另一个包中的 classes 匹配。我试过这段代码:

def abc[A](x: A, i: Int): Any =
{
    x(i)
}

在 运行 上,我收到一条错误消息 A does not take parameters。如何将 Aproject1.package1 文件夹中的少数 class 匹配?这些 class 类似于第 Array/Vector 和 x(i) returns i 个元素。每个 class 采用不同的数据类型(如 Int、Double、String 等)。

如果 class 接受参数,它们 可能 Function1 的子类型。不幸的是,并非所有

所以你可以这样写:

def abc[A <: Function1[Int, _]](x: A, i: Int): Any = {
    x(i)
}

但这不适用于 all 带参数的对象,例如 case class 伴随对象。因此,为了解决这个问题,您可以使用结构类型。类似于:

 def abc[A <: {def apply(i: Int): Any } ](x: A, i: Int): Any = {
    x(i)
}

基本上我们在这里做的是接受具有 apply 方法和 Int 的任何类型的子类型,即它需要一个 Int 参数。

应该注意的是,如果您尝试将输入类型从 Int 泛化为任意 T

,结构类型会让您感到痛苦