Почему явный синтаксис для создания кортежей допускает только AnyRefs как аннотации типов? - PullRequest
3 голосов
/ 13 июля 2011

Этот код работает:

scala> val x = ""
x: java.lang.String = ""

scala> Tuple2[x.type, x.type](x,x)
res5: (x.type, x.type) = ("","")

Этот не:

scala> val y = 0
y: Int = 0

scala> Tuple2[y.type, y.type](y,y)
<console>:9: error: type mismatch;
 found   : y.type (with underlying type Int)
 required: AnyRef
Note: an implicit exists from scala.Int => java.lang.Integer, but
methods inherited from Object are rendered ambiguous.  This is to avoid
a blanket implicit which would convert any scala.Int to any AnyRef.
You may wish to use a type ascription: `x: java.lang.Integer`.
              Tuple2[y.type, y.type](y,y)
                     ^

Как и этот:

scala> val z = ()
z: Unit = ()

scala> Tuple2[z.type, z.type](z,z)
<console>:9: error: type mismatch;
 found   : z.type (with underlying type Unit)
 required: AnyRef
Note: Unit is not implicitly converted to AnyRef.  You can safely
pattern match `x: AnyRef` or cast `x.asInstanceOf[AnyRef]` to do so.
              Tuple2[z.type, z.type](z,z)
                     ^

В спецификации языка сказано:

Синглтон-тип имеет форму p.type, где p - путь, указывающий на ожидаемое значение (§6.1) для scala.AnyRef.

В чем причина этого, и имеет ли смысл снять это ограничение, как это недавно произошло с 0.getClass?

1 Ответ

0 голосов
/ 10 августа 2011

Как вы можете видеть на Иерархия классов Scala Int, Unit, Boolean (и другие) не являются подклассами AnyRef, потому что они переведены в java int, void, boolean и т. Д., Которые не являются подклассами Object.

...