如何在Java代码中将Java函数应用于Scala Option

时间:2016-04-06 15:12:35

标签: java scala primitive-types language-interoperability scala-option

鉴于Scala选项Option[String]Option[Long]Option[Boolean]以及Stringlongboolean的Java消费者,我想应用这些在Java代码中使用静态类型检查干净利落地完成。 问题是,Option[Long]Option[Boolean]在Java代码中变为Option<Object>,因此我需要一个未经检查的类型转换:

<T> void acceptIfDefinedPrimitive(Option<Object> option, Consumer<T> consumer) {
    if (option.isDefined()) {
        consumer.accept((T) option.get());
    }
}

我发现的另一个解决方案是针对每种基本类型的专用Scala函数:

def acceptIfDefined[T](option: Option[T], consumer: Consumer[T]):Unit = {
  if (option.isDefined) {
    consumer.accept(option.get)
  }
}

def acceptIfDefinedLong(option: Option[Long], consumer: Consumer[java.lang.Long]):Unit = {
  if (option.isDefined) {
    consumer.accept(option.get)
  }
}

def acceptIfDefinedBoolean(option: Option[Boolean], consumer: Consumer[java.lang.Boolean]):Unit = {
  if (option.isDefined) {
    consumer.accept(option.get)
  }
}

但实际上,在Java方面,后两者看起来像acceptIfDefinedLong(Option<Object>, Consumer<java.lang.Long>)所以实际上没有严格的类型检查。

  • 我该怎么做?
  • 我如何概括这一点?
  • 我怎么用Java写这个?
  • 有可能吗?

必须可以从Java调用,并且不得有未选中的强制转换。

0 个答案:

没有答案