2

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.

Konstantin Pelepelin
  • 1,303
  • 1
  • 14
  • 29

0 Answers0