Case class companion object generation error for compound type
as @Travis Brown said This is a know issue,fixed in scala 2.11.7.
run under ammonite Repl 2.0.4 (scala 2.12.10 java 1.8.0_242)
@case class Foo(a: Int with Test)
a: Int with Test = 10
You've bumped into one of the cases where Scala's attempt to unify primitives and Objects breaks down. Since Int
in Scala represents the Java primitive type int
, it can't have any traits mixed into it. When doing asInstanceOf, the Scala compiler autoboxes the Int
into a java.lang.Integer
:
scala> val a: Int with Test = 10.asInstanceOf[Int with Test]
a: Int with Test = 10
scala> a.getClass
res1: Class[_ <: Int] = class java.lang.Integer
However, autoboxing doesn't happen when declaring types, so you have to do it by hand:
scala> case class Foo(x: Integer with Test)
defined class Foo
But then the compiler type checker won't autobox before checking the types:
scala> Foo(a)
<console>:12: error: type mismatch;
found : Int with Test
required: Integer with Test
Foo(a)
^
So you would have to declare your variable as Integer with Test
:
scala> val a: Integer with Test = 10.asInstanceOf[Integer with Test]
a: Integer with Test = 10
scala> Foo(a)
res3: Foo = Foo(10)
or use a cast when calling the case class:
val a : Int with Test = 10.asInstanceOf[Int with Test]
scala> a: Int with Test = 10
scala> Foo(a.asInstanceOf[Integer with Test])
res0: Foo = Foo(10)