score:5

Accepted answer

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)

score:2

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

Related Query

More Query from same tag