3
請看下面的例子:如何使用class class primitive屬性創建scalaz.Tagged工作?
import scalaz._
object TaggedExample {
sealed trait Test
def Test[A](a: A): A @@ Test = Tag[A, Test](a)
}
case class TaggedAttribute(l: Long @@ TaggedExample.Test)
它將失敗,接下來有理由編譯:
scalac: type mismatch;
found : Double
required: AnyRef
Note: an implicit exists from scala.Double => java.lang.Double, but
methods inherited from Object are rendered ambiguous. This is to avoid
a blanket implicit which would convert any scala.Double to any AnyRef.
You may wish to use a type ascription: `x: java.lang.Double`.
據我瞭解,這是發生由於案例類的編譯器代碼生成的一些細節(因爲簡單def test(l: Long @@ TaggedExample.Test) = l
編譯就好了)。
如果我們改變的情況下類定義
case class TaggedAttribute(l: java.lang.Long @@ TaggedExample.Test)
編譯一定會成功。
的問題是:是否有辦法避免這種錯誤scalac
不改變l
到java.lang.Long
類型(這反過來,將允許l
是null
等)?
更新
發現這個Tagged type : type mismatch問題,發佈後正確的答案,但仍:可能是有辦法避免使用java.lang.*
箱類型。
非常感謝您指出錯誤。我在看Scalaz的bug,完全錯過了Scala的自己。 – Seigert