scala - Scala中具体用例的类型参数/抽象类型
问题描述
我有一个参数化的 ADT :
sealed trait Location[O]
sealed abstract class SingleRegion(val bucket: String) extends Location[String]
sealed abstract class MultiRegion(val buckets: Seq[String]) extends Location[Seq[String]]
sealed abstract class Synchronized(val bucket: String) extends Location[Seq[String]]
我定义了一个包含位置的类 Log
final case class Log[O, L <: Location[O]](location: L) {
def find(
bucket: String
)(implicit ev: L =:= MultiRegion): Option[Log[String, _ <: SingleRegion]] =
location.buckets
.find(_ == bucket)
.map(bucket => Log(new SingleRegion(bucket) {}))
}
val log: Log[Seq[String], MultiRegion] = Log(new MultiRegion(List("r1", "r2")) {})
println(log.find("r1"))
- 为什么编译器推断的类型(没有类型归属)
log
是[Nothing, MultiRegion]
? - 如何避免繁琐的返回类型
Log[String, _ <: SingleRegion]
?
解决方案
这似乎对我有用。
让我知道它是否不适合你。
final case class Log[O, L](location: L)
(implicit ev: L <:< Location[O]) {
def find(bucket: String)
(implicit ev: L =:= MultiRegion): Option[Log[String, SingleRegion]] =
location
.buckets
.find(_ == bucket)
.map(bucket => Log(new SingleRegion(bucket) {}))
}
推荐阅读
- python - Flask POST 请求给出 ReadTimeout 错误
- python - 无法使用正则表达式从字符串末尾的特殊字符中检索为带有 JSON 的终结符
- c++ - 如何编辑资源 .RC 文件 VS2019 C++
- java - 查找斐波那契单词序列的第 n 个单词(Java)
- python - ValueError:未知的度量函数:精度
- javascript - 为什么 (number).toString(32) 的结果与其他 Base32 编码器实现不同?
- python - 使用 Twisted 实现 SIP 重定向
- java - 如何将项目添加到列表以显示 kotlin 中的所有项目?
- spring-boot - 从多个索引中获取数据,这些索引在 spring-data elasticsearch 中具有一个通用字段
- javascript - 搜索栏未显示或正在处理分页项目以显示学生