关于类型:scala中的参数多态性

Parametric polymorphism in scala

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

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

在运行时,出现错误消息A does not take parameters。如何将Aproject1.package1文件夹中的几个类匹配?这些类类似于数组/向量,并且x(i)返回第i个元素。每个类采用不同的数据类型(例如Int,Double,String等)。


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

所以你可以这样写:

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

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

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

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

请注意,如果您尝试将输入类型从Int推广到任意T

,则结构类型会让您感到悲伤。