diff options
author | Denys Shabalin <denys.shabalin@epfl.ch> | 2015-10-08 14:03:00 +0200 |
---|---|---|
committer | Denys Shabalin <denys.shabalin@epfl.ch> | 2015-10-08 14:47:32 +0200 |
commit | 37eacec819e38cc29357a31ee99b592f31e0702f (patch) | |
tree | 54d6609e37ec82c331ac16c4d01e0e8abc44b5e9 | |
parent | 5614baf08b2da56532b580c7e2f70cf357832970 (diff) | |
download | scala-37eacec819e38cc29357a31ee99b592f31e0702f.tar.gz scala-37eacec819e38cc29357a31ee99b592f31e0702f.tar.bz2 scala-37eacec819e38cc29357a31ee99b592f31e0702f.zip |
Fixes an inconsistency between BoxesRunTime and Predef's autoboxing
Previously autoboxing implicits in Predef were inconsistent with
BoxesRunTime box/unbox due to different treatment of unboxing of
nulls. Implicits didn't check for null and would crash with NPE
unlike the BoxesRunTime which correctly returned zero value of
given type.
The fix is trivial: lets just use asInstanceOfs to implement
implicits in Predef. This would ensure that both have the same
behaviour and that the two would not diverge again in the future.
-rw-r--r-- | src/library/scala/Predef.scala | 34 | ||||
-rw-r--r-- | test/junit/scala/PredefAutoboxingTest.scala | 35 |
2 files changed, 52 insertions, 17 deletions
diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala index 334377e838..a6f0fa9e78 100644 --- a/src/library/scala/Predef.scala +++ b/src/library/scala/Predef.scala @@ -352,23 +352,23 @@ object Predef extends LowPriorityImplicits with DeprecatedPredef { // "Autoboxing" and "Autounboxing" --------------------------------------------------- - implicit def byte2Byte(x: Byte) = java.lang.Byte.valueOf(x) - implicit def short2Short(x: Short) = java.lang.Short.valueOf(x) - implicit def char2Character(x: Char) = java.lang.Character.valueOf(x) - implicit def int2Integer(x: Int) = java.lang.Integer.valueOf(x) - implicit def long2Long(x: Long) = java.lang.Long.valueOf(x) - implicit def float2Float(x: Float) = java.lang.Float.valueOf(x) - implicit def double2Double(x: Double) = java.lang.Double.valueOf(x) - implicit def boolean2Boolean(x: Boolean) = java.lang.Boolean.valueOf(x) - - implicit def Byte2byte(x: java.lang.Byte): Byte = x.byteValue - implicit def Short2short(x: java.lang.Short): Short = x.shortValue - implicit def Character2char(x: java.lang.Character): Char = x.charValue - implicit def Integer2int(x: java.lang.Integer): Int = x.intValue - implicit def Long2long(x: java.lang.Long): Long = x.longValue - implicit def Float2float(x: java.lang.Float): Float = x.floatValue - implicit def Double2double(x: java.lang.Double): Double = x.doubleValue - implicit def Boolean2boolean(x: java.lang.Boolean): Boolean = x.booleanValue + implicit def byte2Byte(x: Byte): java.lang.Byte = x.asInstanceOf[java.lang.Byte] + implicit def short2Short(x: Short): java.lang.Short = x.asInstanceOf[java.lang.Short] + implicit def char2Character(x: Char): java.lang.Character = x.asInstanceOf[java.lang.Character] + implicit def int2Integer(x: Int): java.lang.Integer = x.asInstanceOf[java.lang.Integer] + implicit def long2Long(x: Long): java.lang.Long = x.asInstanceOf[java.lang.Long] + implicit def float2Float(x: Float): java.lang.Float = x.asInstanceOf[java.lang.Float] + implicit def double2Double(x: Double): java.lang.Double = x.asInstanceOf[java.lang.Double] + implicit def boolean2Boolean(x: Boolean): java.lang.Boolean = x.asInstanceOf[java.lang.Boolean] + + implicit def Byte2byte(x: java.lang.Byte): Byte = x.asInstanceOf[Byte] + implicit def Short2short(x: java.lang.Short): Short = x.asInstanceOf[Short] + implicit def Character2char(x: java.lang.Character): Char = x.asInstanceOf[Char] + implicit def Integer2int(x: java.lang.Integer): Int = x.asInstanceOf[Int] + implicit def Long2long(x: java.lang.Long): Long = x.asInstanceOf[Long] + implicit def Float2float(x: java.lang.Float): Float = x.asInstanceOf[Float] + implicit def Double2double(x: java.lang.Double): Double = x.asInstanceOf[Double] + implicit def Boolean2boolean(x: java.lang.Boolean): Boolean = x.asInstanceOf[Boolean] // Type Constraints -------------------------------------------------------------- diff --git a/test/junit/scala/PredefAutoboxingTest.scala b/test/junit/scala/PredefAutoboxingTest.scala new file mode 100644 index 0000000000..e5d8ded5d4 --- /dev/null +++ b/test/junit/scala/PredefAutoboxingTest.scala @@ -0,0 +1,35 @@ +package scala + +import org.junit.Test +import org.junit.Assert._ +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 + +import scala.tools.testing.AssertUtil._ + +@RunWith(classOf[JUnit4]) +class PredefAutoboxingTest { + @Test def unboxNullByte() = + assertEquals(Predef.Byte2byte(null), 0.toByte) + + @Test def unboxNullShort() = + assertEquals(Predef.Short2short(null), 0.toShort) + + @Test def unboxNullCharacter() = + assertEquals(Predef.Character2char(null), 0.toChar) + + @Test def unboxNullInteger() = + assertEquals(Predef.Integer2int(null), 0) + + @Test def unboxNullLong() = + assertEquals(Predef.Long2long(null), 0L) + + @Test def unboxNullFloat() = + assertEquals(Predef.Float2float(null), 0F, 0F) + + @Test def unboxNullDouble() = + assertEquals(Predef.Double2double(null), 0D, 0D) + + @Test def unboxNullBoolean() = + assertEquals(Predef.Boolean2boolean(null), false) +} |