Given Scala Options Option[String]
, Option[Long]
, Option[Boolean]
and given Java consumers for String
, long
, boolean
I want to apply these cleanly, with static type checks, in Java code.
The problem is, Option[Long]
and Option[Boolean]
become Option<Object>
in Java code, so I need an unchecked type cast:
<T> void acceptIfDefinedPrimitive(Option<Object> option, Consumer<T> consumer) {
if (option.isDefined()) {
consumer.accept((T) option.get());
}
}
The other solution I've found is specialized Scala function for each primitive type:
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)
}
}
But actually, on the Java side the latter two look like acceptIfDefinedLong(Option<Object>, Consumer<java.lang.Long>)
so there is actually no strict type check.
- How can I do this?
- How can I generalize this?
- How can I write this in Java?
- Is it possible at all?
Must be callable from Java and must not have unchecked casts.