0

私の質問に応えて、ヌルを短絡するマクロを開発する方法は? 誰かが私に、多くの回答を含む以前の長いスレッドを教えてくれまし。しかし、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
4

1 に答える 1