请考虑以下示例:
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 (反过来,java.lang.Long将允许l成为null等)?
更新
在发帖后立即找到这个标记类型:类型错配问题和答案,但仍然:也许有一种方法可以避免使用java.lang.*框类型。
发布于 2014-03-05 12:04:31
解决方案:使用框类型。
https://stackoverflow.com/questions/22194209
复制相似问题