java - Java Null 的隐式包装

标签 java scala null implicit

我需要从 Scala 访问大量 Java 接口(interface)。这些接口(interface)有可能返回 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 接口(interface)手动创建一个 Scala 包装器。像这样...

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

这看起来很乱,难以维护,而且容易出错。我不想要所有那些什么都不做的额外代码,我想自动包装我所有的 Java 接口(interface),这样如果一个改变,包装器也会改变。

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

最佳答案

我最近结束了这样的事情:

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

用法:

假设您有以下 Java 接口(interface):

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

关于java - Java Null 的隐式包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22130558/

相关文章:

java - 迭代 List<Map<String, Object>> 并使用 Java 将对象的值添加到列表中

scala - 如何将一组值作为环境变量提供给 typesafe/lightbend 配置?

java - Android MobileAds 加载广告时间过长

java - 编译在 Android Studio 中使用的 GitHub 项目

java - Google Protocol Buffer 和 HTTP

scala - 在 java 中使用 scala vararg 方法

scala - 我将如何在 Scala 中实现固定大小的列表?

flash - 帮助 - 使用 stage.addEventListener (ScrollBar) 时出现空对象错误

java - NULL 对象的 StringBuffer 行为

android-studio - Kotlin警告:标记类型为非空的接收器上不必要的安全调用