如何使用类类原始属性进行scalaz.Tagged工作?

时间:2014-03-05 09:55:02

标签: scala tagging scalaz

考虑以下示例:

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.*框类型。

1 个答案:

答案 0 :(得分:2)

了解错误:Compiler error when using tagged types and case classes

解决方法:使用框类型。