通过implicits向伴随对象添加方法

时间:2016-12-11 16:51:42

标签: java scala enums implicit language-interoperability

对于典型的类,您可以创建一个隐式类来将新方法添加到其他类实例,如下所示:

 implicit class IntWrapper(i: Int) {
    def otherMethod(s: String) = println(s"i: ${i} with ${s}")
  }

现在你可以做到

3.otherMethod("something")

我的问题是

  1. 是否可以向Int companion object添加方法?(已回答here

  2. 想象一下,您的项目中定义了一个Java enum,并且您在Scala代码中使用它。 Java enums使用.valueOf(s: String)方法从String获取枚举值,但会抛出IllegalArgumentException。我想添加一个返回.safeValueOf(s: String)的方法Option

    是否可以像在第一个示例中那样将该方法添加到Java enum

1 个答案:

答案 0 :(得分:1)

以下是可以为2做的事情(近似,未经测试):

import scala.reflect.ClassTag
import scala.util.Try

object SafeValueOf {
  def apply[E <: Enum[E]](s: String)(implicit tag: ClassTag[E]): Option[E] =
    Try(Enum.valueOf(tag.runtimeClass.asInstanceOf[Class[E]], s)).toOption
}

用法:SafeValueOf[MyEnum]("something")