Suppose there is the code
sealed trait SomeTrait
case class SomeClass() extends SomeTrait
case object SomeObject extends SomeTrait
And then the someTraitType: Type
is obtained via reflection.
To check that someTraitType
is the type of SomeClass
it can be done easily someTraitType =:= typeOf[SomeClass]
.
The question is how can someTraitType
be checked that is SomeObject
?
And a following question, can the SomeObject
instance be obtained from having corresponding Type
so a simple ==
can be performed?
CodePudding user response:
You need to be careful when using TypeTag
from scala.reflect.runtime.universe._
to check for type equality.
Consider following checks
def isSomeClass[T <: SomeTrait: TypeTag](t: T) = {
typeOf[T] =:= typeOf[SomeClass]
}
def isSomeObject[T <: SomeTrait: TypeTag](t: T) = {
typeOf[T] =:= typeOf[SomeObject.type]
}
The above methods seem to work with following setup
val s1 = SomeClass()
val s2 = SomeObject
println(isSomeClass(s1)) //prints true
println(isSomeObject(s2)) //prints true
However the checks fail when compiler "forgets" types of s1
and s2
.
val s1: SomeTrait = SomeClass()
val s2: SomeTrait = SomeObject
println(isSomeClass(s1)) //prints false
println(isSomeObject(s2)) //prints false
The better way is to use s1.isInstanceOf[SomeClass]
or s2.isInstanceOf[SomeObject.type]
that works in both cases.