scala - 在 Scala 中的方法之间保留类型信息

标签 scala type-safety

这是我的问题:如果某些谓词适用,我有一个很大的对象序列,我想在这些对象上应用过程(我称之为“编译器”)。为了清楚起见,我想将谓词函数与过程分开;然而,在许多情况下,谓词可能非常复杂,并且构建了我想在后面的过程函数中重用的信息。

我定义一个编译器如下:

trait Compiler[A] {
  def mtch(o: SourceObject): Option[A]
  def proceed(o: SourceObject, data: A): Unit
}

以及如何调用编译器:

val compilers: Seq[Compiler[_]]
val objects: Seq[SourceObject]

for (o <- objects; c <- compilers; data <- c.mtch(o)) {
  c.proceed(o, data)
}

也就是说,如果 mtch 函数返回 Some(data),则调用 proceed 方法,其中 data 已附。但是,我无法编译它,因为我在管理编译器时不知道数据的类型。

此外,我在某些情况下实际上不需要任何数据。在我当前的状态下,我让匹配器返回 Some(null),这很糟糕。

最佳答案

改用路径相关类型。替换

trait Compiler[A] {
  def mtch(o: SourceObject): Option[A]
  def proceed(o: SourceObject, data: A): Unit
}

trait Compiler {
  type A
  def mtch(o: SourceObject): Option[A]
  def proceed(o: SourceObject, data: A): Unit
}

一切都会正常。

这里的技巧是,for-commination 中的 data 类型变成 c.A,这是 c.proceed 所期望的类型它的第二个参数。

对于null,让编译器不需要传递参数type A = Unit,所以返回Some(()) 是否应该继续。

关于scala - 在 Scala 中的方法之间保留类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18899155/

相关文章:

java - Lucene 关于否定的嵌套查询求值

Class<T> 到 Parser<T> 的 Java 泛型映射

ocaml,能够在值更改时触发编译错误

java - 使用 Scala Flume Sink 到 Spark

arrays - Scala 中结构的快速打包数组

unit-testing - Scala 规范单元测试

Java/Scala 以类型安全的方式获取 Field 引用

scala - 即使列不在数据框中,Spark 也会下推过滤器

scala - 为什么 Promise 不能是协变的

c# - 为什么 C# 编译器为 GetType() 方法调用发出 callvirt 指令?