diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2012-09-06 21:05:17 +0200 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2012-09-06 23:19:20 +0200 |
commit | 6a740332c7bfd56b20993be6ecd0bf818104f56c (patch) | |
tree | 6884bd48506c9e2468d07cfcf7433121c04cfac2 /test/files/run/t6318_derived.scala | |
parent | adf2d3632b07eef4fc2303aef994e66584a73f49 (diff) | |
download | scala-6a740332c7bfd56b20993be6ecd0bf818104f56c.tar.gz scala-6a740332c7bfd56b20993be6ecd0bf818104f56c.tar.bz2 scala-6a740332c7bfd56b20993be6ecd0bf818104f56c.zip |
SI-6318 fixes ClassTag.unapply for primitives
ClassTag.unapply now has overloads for primitive value classes
so that it can preserve boxiness when performing subtyping tests.
First I wanted to annotate ClassTag.unapply with a ClassTag itself,
i.e. to transform its signature from "def unapply(x: Any): Option[T]"
to "def unapply[U: ClassTag](x: U): Option[T]".
But then virtpatmat_typetag.scala exhibited a nasty problem.
When pattern matching with this unapply, patmat first infers U as something
and then tries to pattern match against this inferred type. And if U gets
inferred as an abstract type itself, bad things happen:
warning: The outer reference in this type test cannot be checked at run time.
That's why I decided to drop the ClassTag idea and go with 9 extra overloads.
Not very beautiful, but definitely robust.
Diffstat (limited to 'test/files/run/t6318_derived.scala')
-rw-r--r-- | test/files/run/t6318_derived.scala | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/test/files/run/t6318_derived.scala b/test/files/run/t6318_derived.scala new file mode 100644 index 0000000000..ccdc18daee --- /dev/null +++ b/test/files/run/t6318_derived.scala @@ -0,0 +1,15 @@ +import scala.reflect.{ClassTag, classTag} + +object Test extends App { + def test[T: ClassTag](x: T) { + println(classTag[T].runtimeClass.isAssignableFrom(x.getClass)) + println(classTag[T].unapply(x)) + } + + class X(val x: Int) extends AnyVal { override def toString = "X" } + val x = new X(1) + // the commented line crashes because of SI-6326 + //println(classTag[X].runtimeClass.isAssignableFrom(x.getClass)) + println(classTag[X].unapply(x)) + test(x) +}
\ No newline at end of file |