我必须在Scala中使用Java函数,该函数接受类型为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)
答案 0 :(得分:6)
字面上应该与Java中的1:1相同:
someFunctionDefinedInAJavaLibrary(Optional.of(javaObj))
从Java-API调用函数时,只需忘记存在asInstanceOf
或scala.Option
。
如果您实际上必须在Java的Optional
和Scala的Option
之间进行翻译,则可以使用scala-java8-compat(maven central),但是在这种特殊情况下没有必要,因为任何地方都没有Option
。
答案 1 :(得分:1)
Some("abc").asInstanceOf[Optional[String]]
不起作用,因为Scala Option
和Java Optional
是不相关的类型。
您可以包括a Java8-compatibility library以便在类型之间进行转换(就像与您可能熟悉的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))
您可以直接在Scala中使用所有Java API方法,包括Optional.of
。