Java Null的隐式包装

opu*_*111 7 java null scala implicit

我需要从Scala访问大量Java接口.这些接口有可能返回Null的方法,我想将它们转换为Option[T]

我找到了其他Option.apply()类似的答案

如何将可以为null或数组的值隐式包装到Scala选项中

选项化Java getter

但是,这要求对于每个Java接口,我手动创建一个Scala包装器.像这样...

class ScalaFoo extends JavaFoo {
  def bar = Option(super.bar)
}
Run Code Online (Sandbox Code Playgroud)

这似乎很乱,很难维护,容易出错.我不希望所有那些无效的额外代码,我想自动包装所有Java接口,这样如果一个更改,包装器也会改变.

当然,有一种方法可以用implicits做到这一点,不是吗?

ser*_*jja 3

我最近得到了这样的结果:

object Implicits {
  implicit class ConvertToOption[T](t: T) {
    def optional = Option(t)
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

假设您有以下 Java 接口:

public interface Fooable {
    public String getFoo();
}

public class Foo implements Fooable {
    public String getFoo() { 
        return null; 
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的 Scala 代码中:

import Implicits._

val foo = new Foo()
val myOptionalValue = foo.getFoo.optional //returns an Option[String], in this case None because getFoo returns null
Run Code Online (Sandbox Code Playgroud)