我在 Scala 中有一个枚举映射到 JPA 中的字符串。为了更舒适的编码,我定义了它们之间的隐式转换。所以我现在可以定义值 val person.role = "User"
, - person.role
是枚举类型 "User"
一个字符串,所以有转换。但是当我尝试比较这两者时,我总是得到错误,因为 def equals (arg0: Any) : Boolean
需要 Any
所以没有触发任何转换。我需要一些显式转换,但我的计划是能够省略它,您认为最佳实践是什么?这里最好的解决方案?
最佳答案
Value("User")
在您的 Enumeration
类型为 Val
.我相信它是 equals
的实现不比较值的字符串名称。我认为这样做的一种严厉方式是创建自己的 Enumeration
和 Val
以便在名称匹配时返回 true。
但是在我的代码使用中,而不是使用 JPA,我总是将字符串转换为 MyEnumeration.Value
.这很容易,例如:
object E extends Enumeration { val User = Value("User") }
scala> val a = E.withName("User")
a: E.Value = User
注意使用
withName
时, 如果字符串与枚举中的任何名称都不匹配,则会出现异常。然后始终在比较中使用枚举字段:
scala> a == E.User
res9: Boolean = true
如果 JPA 只返回一个字符串,并且没有办法绕过它。然后我认为最好的选择是将值转换为字符串并将字符串匹配到字符串,或者将字符串升级为 Val 并比较 Val。混合这些类型将无法进行比较,除非您对
equals
实现某种扩展。方法,这很棘手。
关于scala - 比较字符串和枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3407032/