CaseClassかどうか判定する
import scala.reflect.runtime.universe._
def isCaseClass(typ: Type): Boolean =
if (typ <:< typeOf[Product])
! typ.typeSymbol.fullName.startsWith("scala.")
else
false
判定基準は以下2点。
- Product であること
- fullName が "scala." から始まってないこと
FQCN文字列で切り分けるとか方法が原始的(?)だが、ワリとまともに動くはず。
以下、テスト。
case class Sample(text: String)
def test(typ: Type) {
println(s"${typ} is CaseClass ? ${isCaseClass(typ)}")
}
test(typeOf[Sample])
// => Sample is CaseClass ? true
test(typeOf[List[Any]])
// => scala.List[Any] is CaseClass ? false
test(typeOf[::[Any]])
// => scala.::[Any] is CaseClass ? false
test(typeOf[Option[Any]])
// => scala.Option[Any] is CaseClass ? false
test(typeOf[Tuple2[Any,Any]])
// => (Any, Any) is CaseClass ? false
test(typeOf[util.Success[Any]])
// => scala.util.Success[Any] is CaseClass ? false
test(typeOf[util.Right[Any,Any]])
// => scala.util.Right[Any,Any] is CaseClass ? false