If I have the following case class with a private constructor and I can not access the apply-method in the companion object.
case class Meter private (m: Int
It is possible with some implicit tricks:
// first case
case class Meter[T] private (m: T)(implicit ev: T =:= Int)
object Meter {
def apply(m: Int) = new Meter(m + 5)
}
created some another constructor (and apply method signature) but guaranty that parameter can be only Int
.
And after you have case class with case class features (with pattern matching, hashcode & equals) exclude default constructor:
scala> val m = Meter(10)
m: Metter[Int] = Meter(15)
scala> val m = new Meter(10)
:9: error: constructor Meter in class Meter cannot be accessed in object $iw
val m = new Meter(10)
OR with type tagging (naive implementation):
trait Private
case class Meter private (m: Integer with Private)
object Meter {
def apply(m: Int) = new Meter((m + 5).asInstanceOf[Integer with Private])
}
It works as expected:
val x = new Meter(10)
:11: error: constructor Meter in class Meter cannot be accessed in object $iw
new Meter(10)
^
val x = Meter(10)
x: Meter = Meter(15)
Some possible issues with primitive types and type tags described here