Scala Options Option[String]
、Option[Long]
、および、Option[Boolean]
の Java コンシューマーが与えられた場合、Java コードで静的型チェックを使用してこれらをきれいに適用したいと考えています。問題はJava コードになるため、未チェックの型キャストが必要です。String
long
boolean
Option[Long]
Option[Boolean]
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 側では後者の 2 つが似ているacceptIfDefinedLong(Option<Object>, Consumer<java.lang.Long>)
ため、実際には厳密な型チェックはありません。
- これどうやってするの?
- これをどのように一般化できますか?
- これをJavaで書くにはどうすればよいですか?
- それはまったく可能ですか?
Java から呼び出し可能である必要があり、未チェックのキャストがあってはなりません。