Scala 中的参数多态性
Parametric polymorphism in scala
我正在尝试实现参数多态性以将具有使用 asInstanceOf[]
的大小写匹配语句的函数下放。我需要将参数类型与接受参数的项目的另一个包中的 classes 匹配。我试过这段代码:
def abc[A](x: A, i: Int): Any =
{
x(i)
}
在 运行 上,我收到一条错误消息 A does not take parameters
。如何将 A
与 project1.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
,结构类型会让您感到痛苦
我正在尝试实现参数多态性以将具有使用 asInstanceOf[]
的大小写匹配语句的函数下放。我需要将参数类型与接受参数的项目的另一个包中的 classes 匹配。我试过这段代码:
def abc[A](x: A, i: Int): Any =
{
x(i)
}
在 运行 上,我收到一条错误消息 A does not take parameters
。如何将 A
与 project1.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