scala - 根据类型将值与函数匹配

标签 scala

假设我有一个这样的函数列表:

val funcList = List(func1: A => T, func2: B => T, func2: C => T)

(其中 func1 等在别处定义)

我想编写一个方法,该方法将获取一个值并根据确切类型将其匹配到正确的函数(匹配 a: Afunc1: A => T) 或者如果没有匹配的函数则抛出异常。

有没有简单的方法来做到这一点?

这类似于 PartialFunction 所做的,但我无法将 funcList 中的函数列表更改为 PartialFunctions。我在想我必须将函数隐式转换为一个特殊的类,该类知道它可以处理的类型并能够对其进行模式匹配(基本上将这些函数提升为专门的 PartialFunction )。但是,我不知道如何识别每个函数的“域”。

谢谢。

最佳答案

您无法识别每个函数的域,因为它们在运行时被删除。如果您想要更多信息,请查找删除,但缺点是您想要的信息不存在。

类型删除有多种方法,您会发现很多关于 Stack Overflow 本身的讨论。其中一些归结为将类型信息作为值存储在某处,以便您可以匹配。

另一种可能的解决方案是简单地放弃使用参数化类型(Java 用语中的泛型)为您自己的自定义类型。也就是说,做类似的事情:

abstract class F1 extends (A => T)
object F1 { 
  def apply(f: A => T): F1 = new F1 { 
    def apply(n: A): T = f(n) 
  } 
}

等等。由于 F1 没有类型参数,你可以在其上进行匹配,并且可以轻松创建这种类型的函数。假设 AT 都是 Int,那么你可以这样做,例如:

F1(_ * 2)

关于scala - 根据类型将值与函数匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14657705/

相关文章:

scala - 隐式转换不适用于类型安全的构建器模式

Scalamock 3.模拟无参重载方法

scala - Akka 关闭 TCP actor

java - scala 的 Collectors.groupingBy() 替代方案

java - 是否可以在 Neo4J Java Driver v1.0.3 中为 asList 方法指定元素类型

scala - Scala reduceLeft 实现中的 0.asInstanceOf[B] 发生了什么

java - 是否有maven依赖:get analog in sbt?

android - 是否可以在 android studio 的 java 文件中使用 scala 对象?

scala - 如果对象是类的实例,则批量添加对象

Scala-IDE/IntelliJ::对 Scala、Play 等的模板支持