Получение типа из имени типа в 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]

Мои вопросы

  1. Это нормально, или есть другой способ сделать это (сейчас я использую Scala 2.9.2)?

  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,

Другие вопросы по тегам