Получение типа из имени типа в Scala
После некоторого возни с Scala я пришел к этому решению для создания новых объектов данного типа
object Entity {
def get[T <: Entity: ClassManifest]: T = {
val entity = implicitly[ClassManifest[T]].erasure.getConstructors()(0).newInstance().asInstanceOf[T]
/** some stuff **/
entity
}
}
abstract class Entity {
}
class Implementation extends Entity {
}
а затем использование:
var e = Entity.get[Implementation]
Мои вопросы
Это нормально, или есть другой способ сделать это (сейчас я использую Scala 2.9.2)?
Есть ли что-то вроде Class.forName, которое позволяет получить тип из его имени? (или, в более общем случае, я могу использовать тип как переменную?)
2 ответа
Итак, одна из проблем со Stackru заключается в том, что никто не собирается давать мне очки за то, что я сказал: "Вау, это умно. Ради бога, никогда не делай этого или что-то подобное". Тем не менее, как старший архитектор, это большая часть моей работы.
Если вы используете рефлексию снаружи или библиотеку, или в качестве причины для взаимодействия с библиотекой, вы делаете это неправильно. Так что прекрати.
В качестве альтернативы, вы можете передать Class[T]
:
object Entity {
def get[T <: Entity](e: Class[T]): T = {
val entity = e.getConstructors()(0).newInstance().asInstanceOf[T]
/** some stuff **/
entity
}
}
var e1 = Entity.get(classOf[Implementation])
Ты можешь использовать Class.forName
, но вы потеряете безопасность типов (поскольку строка className может быть чем угодно, не только подклассом Entity), и я думаю, что ваш тип возвращаемого значения должен быть Entity
,