首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Proto Enum转换为Enum

将Proto Enum转换为Enum
EN

Stack Overflow用户
提问于 2022-06-24 04:53:20
回答 1查看 95关注 0票数 2

我得用两个不同的原始文件来表示。

代码语言:javascript
复制
enum Some {
    OPTIONA = 0;
    OPTIONB = 1;
    OPTIONC = 2;
}
代码语言:javascript
复制
enum SomeOther {
    OPTIONA = 0;
    OPTIONB = 1;
    OPTIONC = 2;
}

它们在一个文件中自动生成:

代码语言:javascript
复制
sealed abstract class Some(val value: _root_.scala.Int) extends _root_.scalapb.GeneratedEnum {}
object Some extends _root_.scalapb.GeneratedEnumCompanion[Some] {}

在另一个

代码语言:javascript
复制
sealed abstract class SomeOther(val value: _root_.scala.Int) extends _root_.scalapb.GeneratedEnum {...}
object SomeOther extends _root_.scalapb.GeneratedEnumCompanion[SomeOther] {...}

我希望能够无缝地将Some转换为SomeOther,反之亦然,而不必进行模式匹配。

我真的很喜欢烟囱的表情

代码语言:javascript
复制
Some.transformInto[SomeOther]

但是它不能工作,因为烟囱库错误,类型是不明确的

我尝试这样做一个隐式类:

代码语言:javascript
复制
  implicit class EnumToEnum[From <: GeneratedEnum](enum : GeneratedEnumCompanion[From]) {
    def transformTo[To <: GeneratedEnum](err : Error): Either[Error, GeneratedEnumCompanion[To]] {
      GeneratedEnumCompanion[To].fromValue(enum.value)
      ???
    }
  }

然而,我不能完全做到这一点,因为GeneratedEnumCompanionGeneratedEnum都是特征。

那么,是否有一种方法可以在带有烟囱的原始枚举之间无缝转换,如果不是,我如何编写自己的通用方法?

EN

回答 1

Stack Overflow用户

发布于 2022-06-24 06:59:07

查看鳞状菌,除了您已经提到的解决方案之外,似乎没有更好的解决方案:

由于Scala类型相等不是类型安全的(即使a和b的类型永远不相等,== b也会编译),因此建议使用各种isX方法或模式匹配进行比较:

代码语言:javascript
复制
// Using isX:
val t = if (phoneType.isMobile) "Mobile" else "Not Mobile"

// Using pattern matching
phoneType match {
  case PhoneType.MOBILE => println("Mobile!")
  case _                => println("Not mobile!")
}

在Chimney上的枚举之间转换时,我也找不到任何有用的例子。

执行一个通用方法可能只是起作用,但由于类型擦除,您需要考虑使用反射(如ClassTag )。考虑一下查一下这个

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72739139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档