/ / Dodaj metodę towarzyszenia obiektowi poprzez implicity - java, scala, enums, implicit, interoperacyjność językowa

Dodaj metodę do obiektu towarzyszącego poprzez implicity - java, scala, enums, implicite, interoperacyjność językowa

W typowych klasach możesz utworzyć klasę niejawną, aby dodać nowe metody do innych instancji klas, tak jak poniżej:

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

teraz możesz to zrobić

3.otherMethod("something")

Moje pytania są

  1. czy można dodać metodę do the Int companion object? (Odpowiedzi tutaj)

  2. Wyobraź sobie, że istnieje Java enum zdefiniowany z twojego projektu i używasz go w kodzie Scala. Jawa enums mieć .valueOf(s: String) metoda, która pobiera wartość wyliczenia z a String, ale to rzuca IllegalArgumentException. Chciałbym dodać metodę .safeValueOf(s: String) które zwróci Option.

    Czy można dodać tę metodę do Java enum w taki sam sposób jak w pierwszym przykładzie?

Odpowiedzi:

1 dla odpowiedzi № 1

Oto co ty mogą zrobić dla 2 (przybliżony, niesprawdzony):

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
}

Stosowanie: SafeValueOf[MyEnum]("something").