【问题标题】:Parametric polymorphism in scalascala中的参数多态性
【发布时间】:2017-07-17 09:43:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: scala types parameters polymorphism parametric-polymorphism


    【解决方案1】:

    如果类接受参数,它们可能Function1 的子类型。不幸的是不是全部

    所以你可以写:

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

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

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

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

    需要注意的是,如果你试图将输入类型从Int泛化为任意的T,结构类型会让你悲痛

    【讨论】:

    • 而且结构类型也使用反射,所以会比直接调用更差。在许多情况下,这仍然是可以接受的,但请务必牢记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多