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

如何使用Scala中的Enum.valueOf?

发布时间:2020-12-16 09:56:23 所属栏目:安全 来源:网络整理
导读:我需要从给定Enum的Class实例的字符串中获取 Java枚举值.我尝试了下面的代码,但我得到“未绑定的通配符类型”编译错误.似乎,我需要对存在类型做一些事情,对于某些事情,但是我无法理解如何做到这一点. val paramClass = method.getParameterTypes()(0)val val
我需要从给定Enum的Class实例的字符串中获取 Java枚举值.我尝试了下面的代码,但我得到“未绑定的通配符类型”编译错误.似乎,我需要对存在类型做一些事情,对于某些事情,但是我无法理解如何做到这一点.

val paramClass = method.getParameterTypes()(0)
val value = paramClass match {
  case _ if classOf[Enum[_]].isAssignableFrom(paramClass) => Enum.valueOf[_ <: Enum[_]](paramClass.asInstanceOf[Class[_ <: Enum[_]]],"MYENUM")

解决方法

嗯,艰难的一个.我有一个有效的解决方案,但我发现它很难看.我会对任何更优雅的方法感兴趣!

def enumValueOf[T <: Enum[T]](cls: Class[_],stringValue: String): Enum[_] =
  Enum.valueOf(cls.asInstanceOf[Class[T]],stringValue).asInstanceOf[Enum[_]]

val value = paramClass match {
  case _ if classOf[Enum[_]].isAssignableFrom(paramClass) => enumValueOf(paramClass,"MYENUM")
  case _ => // other cases
}

我认为我们需要这种复杂性的原因……

我们需要编译器相信我们所拥有的Class [_]实际上是一个类[T<:Enum [T]](当然,这是一个初步的测试,这确实是一个Java枚举 - 就像你的代码中所做的那样 - 需要).所以我们将cls转换为Class [T],其中T由编译器推断为<:Enum [T].但是编译器仍然需要找到合适的T,并且默认为Nothing.因此,就编译器而言,cls.asInstanceOf [Class [T]]是一个Class [Nothing].这暂时没问题,因为它可以用来调用Enum.valueOf - 问题是valueOf的推断返回类型当然是Nothing.这里我们遇到了一个问题,因为当我们尝试实际使用Nothing类型的实例时,编译器会插入一个异常.所以,我们最终将valueOf的返回值转换为Enum [_]. 然后诀窍是总是让编译器推断enumValueOf的类型参数,并且永远不会尝试自己指定它(因为我们不应该知道它) – 因此在另一个方法中提取对Enum.valueOf的调用,给出编译器有机会绑定T<:Enum [T]. 正如我所说,我对这个解决方案不太满意,看起来比应该更复杂…… 更新:我稍微简化了代码.

(编辑:李大同)

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

    推荐文章
      热点阅读