Проблема заключается в подписи runtimeClass
:
def runtimeClass: Class[_]
Класса, представляющего тип U, для которого будет удален T. Обратите внимание, что между T и U нет отношения подтипов.
Причина в таких типах, как Any
, Nothing
, et c. Но на самом деле ClassTag
здесь бесполезен, потому что вы делаете ClassTag(<something>).runtimeClass
, который можно упростить до <something>
.
Так что просто разыграйте его:
ClassLoader.getSystemClassLoader.loadClass(stringClassName).asInstanceOf[Class[_ <: SpecificRecordBase]]
(РЕДАКТИРОВАТЬ: как указано Марио Гали c, это должно быть
ClassLoader.getSystemClassLoader.loadClass(stringClassName).asSubclass(classOf[SpecificRecordBase])
Аналогичные изменения применяются ниже.)
или даже проще
Class.forName(stringClassName).asSubclass(classOf[SpecificRecordBase])
Если вы не уверены, получите ли вы подтип SpecificRecordBase
, вы можете проверить его:
val cls = Class.forName(stringClassName)
Try { cls.asSubclass(classOf[SpecificRecordBase]) } match {
case Success(cls1) =>
// handle a subclass
case Failure(_) =>
// handle a non-subclass
}
или без обработки исключений
val cls = Class.forName(stringClassName)
if (classOf[SpecificRecordBase].isAssignableFrom(cls)) {
val cls1 = cls.asInstanceOf[Class[_ <: SpecificRecordBase]]
// handle a subclass
} else {
// handle a non-subclass
}