我得用两个不同的原始文件来表示。
enum Some {
OPTIONA = 0;
OPTIONB = 1;
OPTIONC = 2;
}enum SomeOther {
OPTIONA = 0;
OPTIONB = 1;
OPTIONC = 2;
}它们在一个文件中自动生成:
sealed abstract class Some(val value: _root_.scala.Int) extends _root_.scalapb.GeneratedEnum {}
object Some extends _root_.scalapb.GeneratedEnumCompanion[Some] {}在另一个
sealed abstract class SomeOther(val value: _root_.scala.Int) extends _root_.scalapb.GeneratedEnum {...}
object SomeOther extends _root_.scalapb.GeneratedEnumCompanion[SomeOther] {...}我希望能够无缝地将Some转换为SomeOther,反之亦然,而不必进行模式匹配。
我真的很喜欢烟囱的表情
Some.transformInto[SomeOther]但是它不能工作,因为烟囱库错误,类型是不明确的
我尝试这样做一个隐式类:
implicit class EnumToEnum[From <: GeneratedEnum](enum : GeneratedEnumCompanion[From]) {
def transformTo[To <: GeneratedEnum](err : Error): Either[Error, GeneratedEnumCompanion[To]] {
GeneratedEnumCompanion[To].fromValue(enum.value)
???
}
}然而,我不能完全做到这一点,因为GeneratedEnumCompanion和GeneratedEnum都是特征。
那么,是否有一种方法可以在带有烟囱的原始枚举之间无缝转换,如果不是,我如何编写自己的通用方法?
发布于 2022-06-24 06:59:07
查看鳞状菌,除了您已经提到的解决方案之外,似乎没有更好的解决方案:
由于Scala类型相等不是类型安全的(即使a和b的类型永远不相等,== b也会编译),因此建议使用各种isX方法或模式匹配进行比较:
// 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 )。考虑一下查一下这个。
https://stackoverflow.com/questions/72739139
复制相似问题