Я думаю, что ваше единственное решение - иметь явное отображение.Поскольку вы спрашиваете, как «(автоматически) приравнивать классы упакованных и распакованных типов», я показываю элегантный способ определения функции сравнения.
Во-первых, вместо Class.forName
вы можете использовать classOf[Type]
, когдатип известен во время компиляции.Используя это, вы можете определить канонизирующее отображение распакованных типов в штучной упаковке:
import java.{lang => jl}
val map = Map[Class[_], Class[_]](classOf[Boolean] -> classOf[jl.Boolean],
classOf[Int] -> classOf[jl.Integer]) //XXX add other entries
Затем вы можете определить функцию сравнения:
def cmp(lhs: Class[_], rhs: Class[_]) =
//Canonicalize before comparing
map.getOrElse(lhs, lhs) == map.getOrElse(rhs, rhs)
И протестировать ее:
scala> cmp(classOf[Boolean], classOf[jl.Boolean])
cmp(classOf[Boolean], classOf[jl.Boolean])
res13: Boolean = true
scala> cmp(classOf[Boolean], classOf[jl.Integer])
cmp(classOf[Boolean], classOf[jl.Integer])
res16: Boolean = false
Чтобы прояснить связь между classOf
и Boolean.TYPE
, вот пара взаимодействий REPL:
scala> classOf[java.lang.Boolean] == java.lang.Boolean.TYPE
res7: Boolean = false
scala> classOf[Boolean] == java.lang.Boolean.TYPE
res8: Boolean = true