Как я могу использовать необязательный объект Java в Scala? - PullRequest
0 голосов
/ 28 марта 2019

Я должен использовать функцию Java в Scala, которая принимает аргументы типа Optional<Type>, и объект, который я должен передать ему, также происходит из библиотеки Java, но просто имеет тип Type. Как я могу использовать это в Scala?

Это нормально, если я приведу это так. Обратите внимание, что здесь javaObj происходит из библиотеки Java и имеет тип Type. Но функция someFunctionDefinedInAJavaLibrary здесь ожидает аргумент типа Optional<Type>.

import java.util.Optional
....
// javaObj here is of type Type and comes from a Java library
val scalaObj: Optional[Type] = javaObj.asInstanceOf[Optional[Type]]
// someFunctionDefinedInAJavaLibrary's argument is of type Optional<Type>
val r = someFunctionDefinedInAJavaLibrary(scalaObj)

Ответы [ 2 ]

6 голосов
/ 28 марта 2019

Это должно быть буквально 1: 1 то же выражение, что и в Java:

someFunctionDefinedInAJavaLibrary(Optional.of(javaObj))

Просто забудьте, что asInstanceOf или scala.Option существуют при вызове функций из вашего Java-API.


Если вам когда-либо придется переводить между Optional Java и Option в Scala, вы можете использовать scala-java8-compat ( maven central ), но это не обязательно в данном конкретном случае, потому что нигде нет Option.

1 голос
/ 28 марта 2019

Some("abc").asInstanceOf[Optional[String]] не будет работать, потому что Scala Option и Java Optional являются несвязанными типами.

Вы можете включить библиотеку совместимости с Java8 для преобразования междутипы (как и для совместимости с коллекциями Java, с которыми вы, возможно, знакомы), или просто делайте это вручную.

 def toJavaOptional[A](maybeA: Option[A]): Optional[A] = 
    maybeA.fold(Optional.empty)(a => Optional.of(a))

 def toScalaOption[A](maybeA: Optional[A]): Option[A] =
    if (maybeA.isEmpty) None else Some(maybeA.get)

javaObj имеет тип Type, а не Optional<Type>, но функция ожидает Optional<Type>

Затем сделайте то же самое, что и в Java (которая автоматически не «вставляет» Type в Optional<Type>):

callJavaFunction(Optional.of(a)) 

Вы можете напрямую использовать все методы Java API в Scala, включая Optional.of.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...