2014-03-05 30 views
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不改變ljava.lang.Long類型(這反過來,將允許lnull等)?


更新

發現這個Tagged type : type mismatch問題,發佈後正確的答案,但仍:可能是有辦法避免使用java.lang.*箱類型。

回答

相關問題