scala - Scala 中的方法泛化

标签 scala generics

我尝试概括一种方法来提供类型安全的 API,如下所示:

abstract class AbstractCommand {
  type T = this.type
  def shuffler(s: T => Seq[AbstractCommand])
}

class TestCommand extends AbstractCommand {
  override def shuffler(s: (TestCommand) => Seq[AbstractCommand]): Unit = ??? //error
}

我希望函数参数的预期类型是此层次结构中最具体的。但它没有用。

有没有办法在不引入一些辅助类型参数的情况下在 Scala 中执行类似的操作?

最佳答案

这看起来像是 F-Bounded Polymorphism 的完美用例:

abstract class AbstractCommand[T <: AbstractCommand[T]] {
  self: T =>
  def shuffler(s: T => Seq[AbstractCommand[T]])
}

class TestCommand extends AbstractCommand[TestCommand] {
  override def shuffler(s: (TestCommand) => Seq[AbstractCommand[TestCommand]]): Unit = ???
}

并且使用类型成员而不是类型参数(使用 Attempting to model F-bounded polymorphism as a type member in Scala 提供的示例):

abstract class AbstractCommand { self =>
  type T >: self.type <: AbstractCommand
}

class TestCommand extends AbstractCommand {
  type T = TestCommand
}

class OtherCommand extends AbstractCommand {
  type T = OtherCommand
}

关于scala - Scala 中的方法泛化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44945189/

相关文章:

asp.net-mvc - 用于高速 Web 应用程序开发的 Django、Scala Lift 或 ASP.NET-MVC?

斯卡拉 2.13,SBT : sbt compile uses wrong compiler version

c# - 使用约束重载通用扩展方法 - Func 模式

javascript - 通用无状态组件 React 的类型?或者在 typescript 中扩展通用函数接口(interface)以获得更通用的功能?

c# - 如何从泛型类型中获取对属性访问器的委托(delegate)?

scala - 使用 Scala 将多列转换为 Spark Dataframe 上的一列 map

java - scala 中的模式匹配。当参数表现出多态性或者是子类时,会有什么行为::

java - 如何使用 Channels 和 Scala 并行下载文件?

typescript - 为 TypeScript 中的重载捕获传递函数的泛型类型

c# - 为什么我不能用扩展方法中的泛型类型变量替换 IEnumerable<T>?