鉴于Scala选项Option[String]
,Option[Long]
,Option[Boolean]
以及String
,long
,boolean
的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调用,并且不得有未选中的强制转换。