私の質問に応えて、ヌルを短絡するマクロを開発する方法は? 誰かが私に、多くの回答を含む以前の長いスレッドを教えてくれました。しかし、Int のような Scala AnyVal の「プリミティブ」ではうまく動作しません。
object TestOp {
class SafeDereference[A](obj: A) {
def ?[B >: Null](function: A => B): B = if (obj == null) null else function(obj)
}
implicit def safeDereference[A](obj: A) = new SafeDereference(obj)
class C {
def getValue: Int = 0
}
def main(args: Array[String]) {
val c = new C
val x:Int = c ? (_.getValue)
}
}
次のコンパイルエラーが発生します。
[error] TestOp.scala:14: type mismatch;
[error] found : Any
[error] required: Int
[error] val x:Int = c ? (_.getValue)
[error] ^
[error] one error found
[error] {file:/home/mmalak/streaming-demo/}default-ae36bd/compile:compile: Compilation failed
回避策として、val x:Int を val x:java.lang.Integer に置き換えると、コンパイルされます。val x:Int が許可されるように上記の SafeDereference を改善する方法はありますか?
追加情報
以下は、目的の出力を生成します。問題は、型キャストを SafeDereference に移動する方法と、他のすべての Scala "プリミティブ" (ブール値など) を処理する方法です。
object TestOp {
class SafeDereference[A](obj: A) {
def ?[B >: Null](function: A => B): B = if (obj == null) null else function(obj)
}
implicit def safeDereference[A](obj: A) = new SafeDereference(obj)
class C {
def getValue: Int = 0
}
def main(args: Array[String]) {
val c:C = null
val x = (c ? (_.getValue)).asInstanceOf[java.lang.Integer].asInstanceOf[Int]
println("x="+x)
}
}
必要に応じて出力します。
x=0