Java Null的隐式包装

时间:2014-03-02 17:01:26

标签: java scala null implicit

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

我找到了其他描述Option.apply()的答案

How to implicitly wrap a value that can be null or an array into an Scala Option

Option-izing Java getters

但是,这需要为每个Java接口手动创建一个Scala包装器。像这样......

class ScalaFoo extends JavaFoo {
  def bar = Option(super.bar)
}

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

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

2 个答案:

答案 0 :(得分:3)

我最近得到了类似的东西:

object Implicits {
  implicit class ConvertToOption[T](t: T) {
    def optional = Option(t)
  }
}

用法:

假设您有以下Java接口:

public interface Fooable {
    public String getFoo();
}

public class Foo implements Fooable {
    public String getFoo() { 
        return null; 
    }
}

在Scala代码中:

import Implicits._

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

答案 1 :(得分:3)

我也不知道这样做的好方法。不过我最近在twitter上看到了一个不错的方法:

import Option.{apply => ?}
val fooBar = ?(javaFoo.bar)