加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的模式匹配与案例类

发布时间:2020-12-16 18:23:25 所属栏目:安全 来源:网络整理
导读:我正在为远程存储设计一个模型,结果是: sealed trait StorageTagcase object Gcs extends StorageTagcase object S3 extends StorageTagsealed trait StorageFile[T : StorageTag]final case class GcsFile(bucket: String,path: String) extends StorageFi
我正在为远程存储设计一个模型,结果是:

sealed trait StorageTag
case object Gcs extends StorageTag
case object S3 extends StorageTag

sealed trait StorageFile[T <: StorageTag]
final case class GcsFile(bucket: String,path: String) extends StorageFile[Gcs.type]
final case class S3File(bucket: String,path: String) extends StorageFile[S3.type]

sealed trait StorageConfig[T <: StorageTag]
final case class GcsConfig(keyPath: String) extends StorageConfig[Gcs.type]
final case class S3Config(keyPath: String) extends StorageConfig[S3.type]

def open[T <: StorageTag](storageFile: StorageFile[T],storageConfig: StorageConfig[T]): OutputStream =
  (storageFile,storageConfig) match {
    case (f: S3File,c: S3Config) => //
    case (f: GcsFile,c: GcsConfig) => //
  }

但Scala编译器抱怨以下警告:

Warning:(39,5) match may not be exhaustive.
It would fail on the following inputs: (GcsFile(_,_),S3Config(_)),(S3File(_,GcsConfig(_))
    (storageFile,storageConfig) match {

但在我的具体情况下,用GcsConfig打开S3File显然是没有意义的,反之亦然.有没有办法增强模型?

我个人不喜欢抛出异常或将其作为MatchError留在那些不真实的情况下,例如GcsFile和S3Config.

解决方法

您需要向编译器提供有关允许哪些对的一些信息.通过将pair storageFile:StorageFile [T],storageConfig:StorageConfig [T]传递给open方法,你总是有风险,有人用错误的par调用open方法,你将不得不处理异常情况.为了使其以类型安全的方式工作,您需要传递“知道”允许哪些对的预定义类型.

例如这样:

sealed trait StorageTag
case object Gcs extends StorageTag
case object S3 extends StorageTag

sealed trait StorageFile[T <: StorageTag]
final case class GcsFile(bucket: String,path: String) extends StorageFile[S3.type]

sealed trait StorageConfig[T <: StorageTag]
final case class GcsConfig(keyPath: String) extends StorageConfig[Gcs.type]
final case class S3Config(keyPath: String) extends StorageConfig[S3.type]

sealed trait FileConfPair
case class S3Conf(f: S3File,c: S3Config) extends FileConfPair
case class ScsConf(f: GcsFile,c: GcsConfig) extends FileConfPair

def open[T <: StorageTag](fp: FileConfPair): OutputStream =
  fp match {
    case S3Conf(f: S3File,c: S3Config) => ???
    case ScsConf(f: GcsFile,c: GcsConfig) => ???
  }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读