Рассмотрим следующий пример:Как заставить 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
и т.д.)?
Update
Найден этот Tagged type : type mismatch вопрос и ответ на него сразу после размещения, но все же: может быть, есть способ избежать использования java.lang.*
типов коробки.
спасибо, что указал это ошибка. Я искал ошибки Скаласа и полностью упустил Scala. – Seigert