diff --git a/actor-tests/src/test/scala/org/apache/pekko/util/Scala212CompatTest.scala b/actor-tests/src/test/scala/org/apache/pekko/util/Scala212CompatTest.scala index 526f7fb003..ddf441fdff 100644 --- a/actor-tests/src/test/scala/org/apache/pekko/util/Scala212CompatTest.scala +++ b/actor-tests/src/test/scala/org/apache/pekko/util/Scala212CompatTest.scala @@ -53,4 +53,8 @@ object Scala212CompatTest { // OptionConverters toScala and toJava OptionConverters.toJava(OptionConverters.toScala(java.util.Optional.of(""))) + OptionConverters.toJava(OptionConverters.toScala(java.util.OptionalDouble.of(1.0))) + OptionConverters.toJava(OptionConverters.toScala(java.util.OptionalInt.of(1))) + OptionConverters.toJava(OptionConverters.toScala(java.util.OptionalLong.of(1L))) + } diff --git a/actor/src/main/scala-2.12/org/apache/pekko/util/OptionConverters.scala b/actor/src/main/scala-2.12/org/apache/pekko/util/OptionConverters.scala index 7d1f1b3be6..a088d1e73e 100644 --- a/actor/src/main/scala-2.12/org/apache/pekko/util/OptionConverters.scala +++ b/actor/src/main/scala-2.12/org/apache/pekko/util/OptionConverters.scala @@ -21,9 +21,21 @@ import java.util._ @InternalStableApi private[pekko] object OptionConverters { import scala.compat.java8.OptionConverters.SpecializerOfOptions + import scala.compat.java8.OptionConverters._ @inline final def toScala[A](o: Optional[A]): Option[A] = scala.compat.java8.OptionConverters.toScala(o) + // The rest of the .toScala methods that work with OptionalDouble/OptionalInt/OptionalLong have to be manually + // redefined because the scala.compat.java8.OptionConverters.toScala variants work with scala.lang primitive types + // where as scala.jdk.javaapi.OptionConverters.toScala works with java.lang primitive types. Since the primary + // usecase of these functions is for calling within Java code its preferrable to return Java primitives, see + // https://github.com/scala/bug/issues/4214 + def toScala(o: OptionalDouble): Option[java.lang.Double] = if (o.isPresent) Some(o.getAsDouble) else None + + def toScala(o: OptionalInt): Option[java.lang.Integer] = if (o.isPresent) Some(o.getAsInt) else None + + def toScala(o: OptionalLong): Option[java.lang.Long] = if (o.isPresent) Some(o.getAsLong) else None + @inline final def toJava[A](o: Option[A]): Optional[A] = scala.compat.java8.OptionConverters.toJava(o) implicit final class RichOptional[A](private val o: java.util.Optional[A]) extends AnyVal { diff --git a/actor/src/main/scala-2.13+/org/apache/pekko/util/OptionConverters.scala b/actor/src/main/scala-2.13+/org/apache/pekko/util/OptionConverters.scala index 87d1d88fad..471e7caa8c 100644 --- a/actor/src/main/scala-2.13+/org/apache/pekko/util/OptionConverters.scala +++ b/actor/src/main/scala-2.13+/org/apache/pekko/util/OptionConverters.scala @@ -24,6 +24,12 @@ private[pekko] object OptionConverters { @inline final def toScala[A](o: Optional[A]): Option[A] = scala.jdk.javaapi.OptionConverters.toScala(o) + @inline def toScala(o: OptionalDouble): Option[java.lang.Double] = scala.jdk.javaapi.OptionConverters.toScala(o) + + @inline def toScala(o: OptionalInt): Option[java.lang.Integer] = scala.jdk.javaapi.OptionConverters.toScala(o) + + @inline def toScala(o: OptionalLong): Option[java.lang.Long] = scala.jdk.javaapi.OptionConverters.toScala(o) + @inline final def toJava[A](o: Option[A]): Optional[A] = scala.jdk.javaapi.OptionConverters.toJava(o) implicit final class RichOptional[A](private val o: java.util.Optional[A]) extends AnyVal {