2014-03-05 5 views
3

Рассмотрим следующий пример:Как заставить 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.* типов коробки.

ответ

 Смежные вопросы

  • Нет связанных вопросов^_^