考虑以下示例:
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.*
框类型。